묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결삼각형의 실전! OpenAI Triton 초급
앞으로의 강의 계획에 대하여
안녕하세요! 좋은 강의해주셔서 정말 감사드립니다 이전 공지에서 혹시 Softmax, Flashattention 등의 내용까지 초급으로 포함시키실 것이라고 말씀하셨는데혹시 강의가 추가되는 일정을 구체적으로 알 수 있을까요? 감사합니다
-
해결됨삼각형의 실전! OpenAI Triton 초급
코드가 실행되는 순서에 관하여
@triton.jit def add_kernel(x_ptr, y_ptr, z_ptr, size, block_size: tl.constexpr): (...) def add(x, y): z = (...) size = (...) def grid(meta): return (triton.cdiv(size, meta["block_size"]),) add_kernel[grid](x, y, z, size, 1024) return z 안녕하세요 vector_add.py를 보던 중, 코드 라인이 실행되는 순서가 궁금하여 질문남깁니다 수업에서 runtime 때 meta가 받아진다고 말씀해주셨는데요.그렇다면 코드가 실행되는 순서가runtime 동안 add_kernel의 argument로 들어온 x, y, z, size, 1024가 meta로 받아지고meta를 이용해 grid가 (n, )의 형태로 set되고 그 이후 add_kernel이 실행된다가 맞을까요? 또 하나 궁금한 것은 아래 라인이 실행될 때 @triton.jit 데코레이터의 역할인데요add_kernel[grid](x, y, z, size, 1024)(x, y, z, size, 1024)를 meta로 받아준다그 meta가 적용된 특정 grid 설정 위에서 add_kernel 함수가 실행될 수 있게 해준다일까요? 파이썬에서 원래 함수는 subscriptable하지 않아, 위 syntax가 생소해서 질문드립니다
-
해결됨삼각형의 실전! OpenAI Triton 초급
실행을 위한 최적 환경
안녕하세요 hello_triton.py가 실행이 되지 않아 질문남깁니다 현재 cuda==11.8pytorch==2.1.2triton==2.1 의 환경을 사용하고 있습니다 hello_triton.py 실행 시 아래 오류가 뜹니다Traceback (most recent call last): File "/home/furiosa/Desktop/workspace/Triton/practice-triton/hello_triton.py", line 28, in <module> def hello_triton(): File "/home/furiosa/miniconda3/envs/triton/lib/python3.10/site-packages/triton/runtime/jit.py", line 542, in jit return decorator(fn) File "/home/furiosa/miniconda3/envs/triton/lib/python3.10/site-packages/triton/runtime/jit.py", line 534, in decorator return JITFunction( File "/home/furiosa/miniconda3/envs/triton/lib/python3.10/site-packages/triton/runtime/jit.py", line 433, in init self.run = self._make_launcher() File "/home/furiosa/miniconda3/envs/triton/lib/python3.10/site-packages/triton/runtime/jit.py", line 400, in makelauncher exec(src, scope) File "<string>", line 2 def hello_triton(, grid=None, num_warps=4, num_stages=3, extern_libs=None, stream=None, warmup=False, device=None, device_type=None): ^SyntaxError: invalid syntax triton==2.2 가 아니라 2.1을 사용하는 이유는, hello_triton.py 실행 시 아래 오류가 떴기 때문입니다RuntimeError: Triton Error [CUDA]: device kernel image is invalid 공식홈페이지에서 제공하는 01-vetor-add.py 같은 경우 실행이 잘됩니다triton을 사용하기 위한 최적환경은 무엇인지 별 설명이 없었던 것 같은데요어떤 cuda/pytorch 환경을 사용해야 오류가 가장 안나고 안정적인가요?위 오류는 왜 일어나고 어떻게 해결할까요? 인터넷에도 크게 도움되는 정보는 없어서 부득이 질문 남깁니다ㅠㅠ
-
해결됨삼각형의 실전! OpenAI Triton 초급
강의 계획에 대하여
안녕하세요!모든 강의가 다 나오지는 않았지만 너무 좋은 강의인 것 같아 먼저 결제를 했습니다 ㅎㅎ혹시 바쁘시겠지만 섹션 4. Triton 톺아보기(TBD)에 대한 업데이트 계획을 알려주실 수 있을까요?제목만 봐서는 Triton 전체 개괄을 해주는 것 같아 꼭 들어보고 싶습니다업데이트 해주실동안 열심히 따라가고있겠습니다~~~!고급 강의도 기대 중입니다! 감사합니다!
-
해결됨삼각형의 실전! OpenAI Triton 초급
행렬곱 오차 문제
안녕하세요. 큰 질문은 아니고 사소한 질문일 수도 있습니다만.. 다름이 아니라, 행렬곱 강의에서 구현한 코드에서는 곱해주는 행렬 크기가 커질수록 오차가 누적되는 듯한(정확히 말하면 파이토치 내장 matmul과 계산 결과가 점점 더 달라지는듯한) 현상이 관찰되어 질문드립니다. 먼저, 실습에서 정의한 코드에서부터 x = torch.randn(16,16,device = 'cuda') y = torch.randn(16,16,device = 'cuda') a = matmul(x,y) b = torch.matmul(x,y) assert torch.allclose(a,b)torch.allclose 의 기본 인자(atol=1e-8, rtol=1e-5) 세팅에서는 assertion error가 발생하여 조건을 완화시켜야(atol=1e-5, rtol=1e-5) assertion이 통과되는 모습을 보였고x = torch.randn(2048,1024,device = 'cuda') y = torch.randn(1024,256,device = 'cuda') x, y의 크기를 이와 같이 키웠을 경우엔 atol=1e-4, rtol=1e-4로 조건을 완화시켜야 assertion을 통과하는 모습을 보였습니다. triton kernel로 구현한 행렬곱 연산과 PyTorch 내장 matmul 연산 모두 fp32로 연산이 이루어지고 있는데, 이러한 오차가 발생할 수 있는 원인에 무엇이 있는지 궁금해서 질문 드립니다.
-
해결됨삼각형의 실전! OpenAI Triton 초급
실습 코드
실습코드 제공해주신다고 인트로에서 말씀하셨는데 어디서 볼 수 있나요?
-
미해결딥러닝 CNN 완벽 가이드 - Fundamental 편
활성화 함수에 대한 전반적인 질문 드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 권철민 선생님 안녕하세요, 딥러닝 cnn 완벽 기초 강의를 모두 수강 하고 복습을 하던 중에, 활성화 함수의 전반적인 개념, 특히 ReLu 함수에 대해 질문이 있습니다. 우선 활성화 함수가 필요한 이유는 모델의 복잡도를 올리기 위해서라고 이해했습니다. 단순 퍼셉트론에서 XOR 문제를 해결할 수 없었던 문제를 해결하기 위해 MLP가 등장했고, 여기에서 step function이 활성화 함수로 사용되어 이전 층의 결과값을 함수에 집어 넣어 다음 층으로 전달하는 역할을 맡게 되었습니다. 하지만 MLP를 넘어 더 많은 히든 레이어를 쌓아 올리는 DNN의 경우, 선형 함수의 특성상 이를 여러번 겹쳐서 쌓아 올려도 결국에는 하나의 선형 함수로 표현할 수 있기 때문에 복잡도를 올리기 위해 레이어를 더 쌓는 의미가 없다고 이해했습니다.(물론 이렇게 쌓을 경우 레이어마다 가중치가 생기기 때문에 아예 의미가 없다고는 할 수 없겠으나, 모델 자체의 복잡도를 올리기 위한 목적에는 부합하지 않는다고 생각하고 있습니다). 단순한 퍼셉트론을 넘어 다층 퍼셉트론에서는 기존의 단층 퍼셉트론만을 활용했을 때는 풀 수 없었던 복잡도의 문제 해결이 가능해졌지만, 동일한 방법으로는 아무리 레이어를 쌓아도 더욱 복잡한 문제는 풀 수 없었습니다. 때문에, 더욱 복잡한 문제를 풀기 위해서 모델의 복잡도를 올리기 위해서는 선형 활성화 함수를 여러개 사용하여 쌓아도 결국 하나의 레이어를 사용하여 나타낼 수 있는 상황을 막아야 하기 때문에 이와 반대로 비선형 활성화 함수를 사용한다고 이해하고 있습니다. 비선형 활성화 함수들의 예시로 시그모이드, 하이퍼볼릭 탄젠트와 같이 shape 자체가 비선형인 함수들이 각광받았는데, 작은 미분값으로 인해 깊은 네트워크로 갈수록 역전파 과정에서 발생하는 Gradient Vanishing 문제, 그리고 양극단으로 값이 모일수록 명확성이 떨어진다는 단점때문에 히든 레이어의 활성화 함수로는 더는 차용되지 않는다고 이해하고 있습니다. 이러한 기울기 소실 문제를 해결하기 위해 대부분의 은닉층에서는 활성화 함수로 ReLu함수를 사용한다고 이해하고 있는데요, 렐루 함수일 경우 ReLu(-1) + ReLu(1) != ReLu(-1 + 1)이기 때문에 비선형 함수이지만, (음의 무한대, 0] 그리고 [0, 양의 무한대) 구간에서는 선형이라고 알고 있습니다. 이를 고려한다면 ReLu 함수는 비록 전체 구간에서는 비선형 함수이지만, 대부분의 구간에서는 선형 함수인데 이러한 부분을 고려할 때 어떻게 ReLu 함수를 사용할 때 저희가 시그모이드와 같은 함수에서 기대하는 것과 같은 비선형적인 특성으로 모델의 복잡도를 올려줄 수 있는것인지 직관적으로 잘 와닿지가 않습니다. 또한, CNN 연산 적용 후 ReLu 함수를 적용하는 부분이 궁금합니다. 이미지의 특정 영역에 filter값을 곱해서 특정을 추출하는 feature extracting 과정에서 합성곱 연산의 값이 크게 나올수록 이미지의 해당 영역이 해당 필터가 추출하고자 하는 값(가로, 세로, 커브 모양 등등)을 강하게 나타내고 있다고 이해하였는데요, 그렇다면 이렇게 추출되서 생성된 새로운 feature map에 ReLu 함수를 적용하는 이유는 모델의 복잡도를 올리기 위해 비선형적인 함수를 추가하는것 뿐만 아니라 예를 들어서 가로 선을 추출하기 위한 필터를 통과했을 경우, 값이 커서 가로에 해당할 확률이 높은 부분은 그대로 유지하되, 음수로 결과가 나와 가로의 특성과는 전혀 맞지 않는 특성을 모두 0으로 만들어서 가로 특징이 없다고 정리하는 역할 또한 존재할까요? 혹시 제가 놓친 ReLu 함수를 CNN의 활성화 함수로 쓰는 이유가 있다면 지적 부탁드립니다. 이미지의 픽셀은 0~255의 값으로 구성된다고 알고 있는데 음수일 경우도 존재할까요? 만약 합성곱 연산의 결과로 음수값이 나왔다면 어떻게 해석하는지 궁금하고 또 이럴 경우 filter의 weight가 음수로 크게 설정되어 있어서 발생하는 경우인지도 궁금합니다. 그리고 CNN 모델의 진행 과정에서, 입력층과 가까운 Conv layer일수록 이미지의 edge, textile같은 low level 특징을 추출하는 것에서 출력층과 가까울수록 더욱 더 추출된 특징들을 일반화 시킨다고 이해했는데 제가 맞게 이해했을까요? 마지막으로 그렇다면 이때 각 filter마다 이미지 안에 가로, 세로, 혹은 다양한 모양들의 곡선적인 특징들이 존재하는지에 대해 추출하는 역할을 담당하게 될것이라고 예상되는데, 이렇게 필터마다 작업이 할당되는 자세한 로직이 알고싶다면 어떤 분야에 대해 더 공부해보아야 할지 추천 부탁드리겠습니다. 현재 머리속에서 너무 많은 부분들이 정리가 안되어서 글이 장황해진점 너무 죄송합니다. 혹시 제가 어떤 의도로 질문을 드린건지 잘 파악이 안되시는 부분이 있다면 풀어서 써보겠습니다. 항상 감사합니다 선생님!