-
Notifications
You must be signed in to change notification settings - Fork 2
4회차 받아쓰기
Attendees 1 00:01 습니다. 네 그럼 시작하도록 하겠습니다. 모두 새해 복 많이 받으시고요. 네 저희가 이제 3주 만에 다시 시작을 했는데 또 이렇게 참석해 주셔서 감사합니다.
Attendees 1 00:23 오늘은 지금까지 저희가 했던 것들을 잠깐 리키을 해 보면 맨 처음에 저희가 전반적인 기술적인 개요에 대해서 이야기를 했었고 그리고 이제 이거 모드 이야기를 한 다음에 그리고 이제 그래프 모드 이야기를 했고요. 이제 오늘 이제 오토매틱 디션 이야기를 할 차례인데 원래 이제 제가 이 네 번째 네 번째 맞죠? 이 네 번째 시간은 그런 이거 모드와 그래픽 모드를 묶어가지고 이제 그러면 그걸 가지고 파이토치를 가지고 어떤 일을 할 수 있나라고 하는 거를 브로드하게 커버를 할까 생각을 했는데 그것보다는 또 약간 좀 주제를 좀 좁히더라도 깊게 들어가는 게 좋을 것 같아 가지고 네 가장 중요한 부분이기도 한 이런 오토메틱 디퍼렌시이션에 관련해서 한번 다뤄보도록 하겠습니다. 네 원래 했던 것처럼 네 저희 질문이 있으시면은 인콜 메시지에 남겨주셔도 되고 아니면 제가 중간중간에 질문하실 기회를 드릴 테니까 그때 질문을 하셔도 괜찮을 것 같습니다. 시작하도록 하겠습니다.
Attendees 1 01:36 네 전체적인 아젠다는 일단 오토매틱 디퍼런시에이션에 관련되어 있는 기술적인 백그라운드에 대해서 먼저 커버를 하고 이게 파이토치에는 어떻게 구현되어 있나 이렇게 두 부분으로 나눠서 오늘 말씀드리려고 하고요. 일단 그 백가운드 같은 경우에는 지금 저희가 다루고 있는 100프로 이 언 스토바이지드 러닝 스토바이드 러닝이 사실 약간 차이가 불분명하긴 한데 어쨌든지 간에 지금 저희가 다루고 있는 대부분의 트레이 머신러닝 같은 경우에는 특정 데이터를 주고 그다음에 그 데이터에 답을 알고 있다는 상태에서 포드로 갔다 다시 백오드로 와서 조정을 하도록 되어 있거든요. 그걸 저는 여기서 그냥 슈퍼바이드 러닝이라고 표현을 했고요. 그거에 대해서 잠깐만 하이레벨로 저희가 그냥 한번 리팩을 한 다음에 백 프로 그리고 오토매틱 디퍼렌시션 이렇게 나눠 가지고 한번 다뤄보도록 하겠습니다. 슈퍼바이즈드 러닝
Attendees 1 02:38 이라는 게 학문적으로 여기에 가장 잘 맞는 부분인지 모르겠지만 어떻게 보면 이게 그래디언 디센트라고도 볼 수 있기는 한데 저희가 어떤 데이터를 가지고 그다음에 그 데이터 데이터를 특정 어떤 라고 어떤 이제 트레이닝하는 트레이닝 데이터가 주어지고 트레이닝 데이터는 어떤 함수의 인풋들과 기대하는 아웃풋의 페어로 되어 있는 상황에서 저희가 모르는 변수들 여기서 지금 웨이트라고 표현할 수 있는 a나 b 같은 이런 웨이트가 있을 이걸 가장 잘 근사를 할 수 있는 그런 a와 b를 찾아가는 과정을 저희가 이제 트레이닝이라고 생각을 한다면 예를 들어서 제가 그래프를 아무렇게나 그려봤는데요 이걸 이제 뭐 어차피 x와 y 이렇게 두 가지가 있는 거니까 저희가 2디맨 저널 평견에서 생각을 할 수가 있고 거기에서 특정 a와 특정 b의 값에 해당을 하는 선을 그리게 되면 그러면 여기서 지금 제가 실손으로 표현을 한 부분이 제가 이렇게 아무렇게나 그린
Attendees 1 03:38 그런 선이거든요 그런데 그 선을 보면은 뭔가 이 선이 제가 찍어 놓은 세 점을 가장 표현을 잘 하고 있는 그런 선은 아닌 것 같잖아요 이거를 좀 더 이 세 가지의 데이터를 잘 표현하는 선으로 만들기 위해서는 약간 더 기울기를 좀 바꾸고 그다음에 바이러스 값을 조금 더 움직이면 그럼 조금 더 잘 표현하는 것처럼 움직일 수가 있거든요. 근데 그렇게 하는 게 결국에는 길게 해당하는 a 값을 조금 더 적게 만들고 그다음에 바이러스에 해당하는 b 값도 조금 더 작게 만들면 그러면 이 점 세계에 조금 더 잘 표현을 하는 그런 선으로 옮길 수가 있겠죠. 이렇게 저희가 트레이닝 데이터가 주어졌을 때 그걸 가장 잘 표현할 수 있는 그 로스를 최소화할 수 있는 그런 웨이트 값으로 조금 조금씩 변해가는 과정을 저희가 트레이닝이라고 생각을 할 수가 있습니다.
Attendees 1 04:31 이거를 실제로 그러면 제가 방금 이야기했던 것들을 조금 더 체계적으로 설명을 해 보면 어떻게 생각할 수가 있냐면은 일단 현재 지금 예를 들어서 시점에서 랜덤에서 시작을 했든 아니면은 트레이닝의 중간 값이든 어쨌든 지금 정해져 있는 그런 a, b에 해당하는 웨이트를 가지고 일단은 지금 있는 트레이닝 데이터가 얼마나 잘 맞나를 확인을 해볼 수가 있겠죠. 그걸 확인하기 위해서는 이제 포드라고 하는 실제 인풋으로부터 기대되는 아웃풋 값을 쭉 이제 계산을 하는 그런 과정을 거치게 되고요. 그걸 저희가 뉴럴 네트워크 콘텍스트에서는 보통 포드라고 부르게 되고요. 트레이닝 데이터의 인풋을 가지고 포워드 함수를 실행을 하게 되면 결과를 얻게 되고 이 그림에서는 제가 이 아웃풋이라고 표현한 이 부분이 될 거고요. 그랬을 때 원래 제가 기대하는 그런 아웃풋 값들이 있다고 한다면 이 둘의 차이를
Attendees 1 05:26 어 가지고 이제 루스를 구할 수가 있고요. 그걸 제가 이제 로스 펑션이라고 표현을 했고 그 로스 펑션을 가지고 제가 실제 로스라고 하는 걸 구할 수 있고요. 그러면 이 로스를 가지고 그러면 내가 이 로스를 줄이기 위해서는 어떻게 값들이 고정이 돼야 되나라고 하는 것들을 뒤에서부터 앞으로 쭉 끌어당길 수가 있어요. 네 그래서 그 뒤에서부터 앞으로 이제 그래디언트를 찾아서 쭉 끌어당기는 과정을 저희가 백워드라고 표현을 하고 이 과정이 100 프로퍼게이션이기도 하고 그게 자동화 돼 있으면 그게 이제 오토매틱 버션이라고도 할 수가 있겠죠. 그래서 나온 그 최종 값 그래서 로스를 계속 끌어당겨서 다시 인풋 단까지 다 끌고 내려오면 네 그러면은 그 인풋 간까지 끌고 내려오는 과정에서 중간에 이제 거쳐가는 모든 웨이트들에 대한 보정 값이 구할 수가 있게 되고요. 그 보정 값을 그냥 구하는 게 아니라 옵티마이저라고 하는 내가 그걸 실제로
Attendees 1 06:28 weight 보정에 어떻게 반영할 것인가라고 하는 거를 어떤 함수를 통해서 다시 한 번 계산을 하게 되고 그만큼 값을 이제 보정을 한 새로운 모델 모델이 아키텍처는 바뀌지 않지만 업데이트가 된 웨이트로 이 과정을 다시 반복을 하게 되면 로스가 떨어질 확률이 크겠죠 저희가 이제 그래디언트라고 하는 것 가지고 반복해서 하게 되면 그래서 저희가 원하는 것까지 수렴을 하게 되면 전체적으로 트레이닝이 끝나게 됩니다. 이게 어떻게 보면 저희가 지금 일반적으로 이해를 하고 있는 슈퍼바이드 러닝이라고 할 수 있고 여기에서 이제 포드 그다음에 백워드라고 하는 이런 함수들이 하는 역할이라고 생각을 할 수가 있습니다. 여기서 은지 님께서 질문을 남겨주셨는데 제가 일이 많아서 이거를 답을 못하고 오늘 그냥 잘라붙여서 까먹지 않고 답을 하려고 해놨고요.
Attendees 1 07:17 네 100이라고 하는 거를 제가 여기서는 그냥 추상적으로 그레디언트를 그러니까 로스로부터 시작한 그런 이제 보정해야 될 값들을 쭉 인풋 단까지 끌어당기면서 그 중간에 있는 모든 웨이트들의 보정할 그래디언트를 계산하는 과정이라고 제가 대충 추상적으로 설명을 드렸는데요. 이거를 이제 그다음 페이지에 조금 더 약간 체계적으로 볼 수가 있을 텐데요. 저희가 미분을 다 배우잖아요 미분을 미분이 학과에서 학과 과정에서 빠졌다는 이야기도 들었던 것 같은데 아닌가요? 제가 잘못 들은 것 같기도 하고 어쨌든 고등학교에서 더 이상 미분을 안 배운다는 그런 이야기를 들었던 것 같기도 하고 제가 잘못 들은 것 것 같기도 한데 어쨌든 미분을 다 아신다는 가정 하에 이렇게 이제 함수가 여러 개의 함수가 이렇게 컴퍼지 되어 있는 그런 상황에서 저희가 미분을 하게 되면 먼저 목에 안에 들어있는 거에 미분을 하고 또 거기에 또 미분을 하고 하다 보면 이 오른쪽에 있는 dy DX dy DP DTDX 같은 그런
Attendees 1 08:22 식으로 만들면 저희가 이렇게 여러 함수를 컨버즈로 해가지고 만든 다른 함수의 미분 함수를 구할 수가 있잖아요 이게 어떻게 보면은 이 체인 룰이라고 하는 거고 이 체인 룰에 특정한 통으로 특히 그 값이 이제 뒤에서부터 쭉 앞으로 연결이 되는 과정으로 표현을 하게 되면 그게 이제 백 프로퍼게이션이라고 하는 거의 수학적인 표현이 되겠죠 여기에서 실제 일어나는 일이 뭐냐 하면 y가 f라고 하는 함수의 결과값인데 이제 그 인 값이 이제 g라고 하는 함수에 x라고 하는 값을 넣었을 때 나오는 과정이다라고 생각을 할 수가 있죠. 이거는 제가 지금 사실 뒤에서부터 앞으로 이야기를 한 거예요. 그러니까 y가 최종 아웃풋이고 그게 어떻게 결과가 나왔나를 제가 사실은 이제 거꾸로 이야기를 한 거고요. 이제포로 이야기를 하게 되면 x라고 하는 인풋이 있고 거기에 g라고 하는 함수를 얻었을
Attendees 1 09:13 이 오른쪽에 나왔던 것처럼 t라고 하는 값이 튀어나오게 되고 그걸 다시 f라고 하는 함수에 적용을 하면 최종 보신 y 값이 나오는 건 제가 이제 포드로 설명을 하게 되겠죠 여기에서 실제 그러면은 저희가 이제 궁금한 거는 이 인풋에 해당하는 x라고 하는 어떻게 보정을 해야 y 값에 어떤 영향을 미치는지라고 하는 그러니까 dy DX라고 표현이 되어 있는 이 값을 알고 싶다 라고 한다면은 그러면 방금 했던 과정을 그대로 밝아가면서 그럼 t라고 하는 값이 변할 때 y가 어떻게 영향을 받는지 그다음에 d라고 하는 값이 변할 때 그럼 t라고 하는 값이 어떻게 영향을 받는지라고 하는 이 두 개를 결합을 하게 되면 그러면 x라고 하는 게 변했을 때 y라고 하는 게 어떻게 영향을 받는지를 알 수가 있겠죠. 네 이게 네 어떻게 보면은 이제 백 프로퍼게이션이라고 하는 게 일어나는 과정이라고 생각을 하시면 됩니다. 실제
Attendees 1 10:10 방금 제가 말씀드린 이 과정이 아까 그 전 페이지에서 저희가 봤던 포워드 100워드 하는 과정이랑 거의 비슷하고요. 실제 이제 머신러닝 뉴얼 네트워크에서는 여기서 와도 하나가 아니라 여러 개의 변수일 수 있고 그다음에 인풋으로 들어오는 것들도 하나가 아니라 여러 개일 수도 있고 그런데 그중에서는 실제 저희가 그래디언트에 변할 것에 관심이 있는 저희가 바꿀 수 있는 그런 인풋이 있고 고정되어 있는 인풋들이 있거든요. 바꿀 수 있는 인풋이 어떤 거에 해당할까요? 웨이트겠죠 웨이트가 바뀌는 거니까 바뀔 수 있는 인풋이 웨이트고 이제 바뀌지 않는 인풋이 사실은 네 진짜 이 모델의 인풋이죠. 왜냐하면 바뀌지 않는다는 이야기는 뭐냐 하면 저희가 트레이딩 데이터는 고정을 했잖아요. 실제 인퍼런스를 한다라고 생각하면 당연히 계속 인풋들은 바뀌게 되겠지만 지금 트레이닝 과정에서는 저희가
Attendees 1 11:03 저희가 잘 알고 있는 인풋 가우 페어를 가지고 있고 그것들은 바뀌지 않기 때문에 전체 과정에서 보면 사실은 그 인풋은 창수라고 볼 수가 있죠. 그래서 그런 고정되어 있는 값에 대해서는 저희가 사실은 그레이디언트를 구할 필요는 없는 거고 네 그렇습니다. 네 이게 백 프로플레이션이라고 하는 거에 이제 간략한 수학적인 배경이었습니다. 이런 과정을 실제 사람이 손으로 한다면 굉장히 번거로울 텐데 이거를 이제 차근차근 생각을 해 보면 알고리즘믹하게 접근할 수 있는 그런 방법이 있어요. 여기서 이제 실제 이제 변수도 두 개가 되고 그다음에 함수도 약간 복잡한 함수를 제가 찾아가지고 그냥 긁어왔는데 여기에서 있는 이런 함수가 그래프로 이제 표현을 하게 되면 그래프로 표현을 하게 되면 x1과 x2라고 하는 인풋이 있고 그다음에 그 중간 값들이 이런 로그 함수라든지 곱하기라든지 사인의 중간 결과값들이고요.
Attendees 1 11:59 그런 것들이 최종적으로 다 합쳐져서 최종적으로 이제 f의 x1 x2에 해당하는 최종 결과물이 나오게 되는데 이걸 이제 그래프로 이렇게 표현을 해 보면 저희가 보통 뉴널네트에서 생각할 수 있는 이런 포드 그래프에 해당하는 그런 그래프를 그릴 수가 있거든요. 그럼 이런 포드 그래프가 있다라고 한다면은 이걸 저희가 이제 다시 뒤로 이제 가면서 각 단계에서 그 노드에 해당하는 그런 함수 함수들에 대해서 저희가 원하는 그런 인풋들에 대해서 편미분을 하게 되면 그러면은 그 중간 단계에서 어떻게 값들이 프로퍼게이션 되는지를 중간에 하나하나 다 확인을 해 갈 수가 있어요. 지금 여기에 이제 오른쪽에 나와 있는 리버스트레이스라고 하는 부분이 방금 제가 말씀드린 이런 부분을 실제 계산을 한 거거든요 여기서 보면 실제 보드로 가면서 실제 중간 단계로 어떤 값들이 튀어나오나라고 하는 것들도 다 저장을 하고 있고
Attendees 1 12:54 그리고 실제 그 함수들이 어떤 함수들이였나라고 하는 것들도 다 알고 있다라고 한다면은 이 과정을 다시 거꾸로 가면서 해당하는 노드에 해당하는 편미분 함수 각 인풋에 대한 편미분 함수를 구할 수가 있고 그 편미분 함수의 그 점 그 어떤 특정한 점에서의 기울기를 찾는 거니까 그 점에 해당하는 그 점에서의 값들을 이제 입력을 하게 되면 그럼 저희가 원하는 그런 인풋에 대한 표면 값을 구할 수가 있고 이런 것들을 쭉 프로케이션을 아까지 하게 되면 x1과 x2에 대한 최종 그래디언트를 저희가 구할 수가 있습니다. 여기 나온 과정 하나하나를 지금 다 밟아가기는 어려워서 이건 스킵을 하겠지만은 이 슬라이드를 보셔도 되고 아니면은 제가 여기 링크 걸어놓은 자료를 보셔도 되고 아니면 구글에서도 충분히 이런 100프로 페션에 관한 정보들을 많이 찾을 수가 있으니까 한번 각자 다 공부를 해 보시면 좋을 것 같습니다.
Attendees 1 13:57 제가 방금 말씀드린 거를 또 다시 한 번 약간 더 실제 제가 말하는 건 값을 구하는 과정들을 그려놓은 그림이 하나가 더 있어가지고 제가 한번 여기에 넣어봤는데요 제가 비슷한 설명을 한 번 더 해보도록 할게요. 왼쪽에 있는 그림이 표현을 하는 게 뭐냐면 그 왼쪽 오른쪽이 똑같나요? 아니죠 네 왼쪽에 있는 게 뭐냐 하면 실제 포드 과정을 지금 그려놓은 건데 a 값이고 a와 b라고 하는 인풋을 가지고 시작을 해서 중간에 더하고 그다음에 b의 값에는 a와 b를 더하고 그다음에 b에 1만큼 더한 이 두 값을 다시 곱하면은 이 그래프의 최종 결과가 나오는 이런 그래프가 이런 그래프가 있다라고 한다면 여기에서 특정한 인ut a는 2 b라는 1이라고 하는 걸 입력을 해서 저희가 포드로 계산을 하게 되면 여기 나와 있는 것처럼 이제 이 값은 6이 되겠죠 네 그렇게 되고 거기에서 각각의 그러면은 중간 단계 그래디언트를 쭉 이제 저희가 계산을 해서 예를 들어서
Attendees 1 15:09 e에 대한 그러니까 a에 얼마큼 이가 민감한가라고 하는 거를 저희가 찾고 싶고 그다음에 b라고 하는 변수에 이가 얼마큼 민감한가 저희가 방금 계산한 이 포드 인스턴스에 대해서 라고 하는 걸 알고 싶으면 저 맨 위에서 위에서부터 시작을 해서 e 2에 대한 이의 민감은 똑같은 값이니까 1일 거고요. 1이라고 생각을 할 수가 있고 그다음에 2를 c에 대해서 이제 편미분을 하게 되면 원래 있는 함수가 2는 c 곱하기 d니까 거기에서 c로 편입을 하게 되면 이제 d만 남게 되고 여기에서 이제 d 값이 이었기 때문에 네 e가 시에 의해서 영향을 받는 민감도는 이라고 볼 수가 있고요. 숫자에도 있고 알파벳 2도 나오는데 여기 그림에 이라고 나와 있으니까요 거기 잘 보실 수 있을 거라고 생각을 합니다. 이걸 써볼까요? 이라고 할 수가 이라고 볼 수가 있고요. 네 그다음에 반대로
Attendees 1 16:09 이 부분으로 가게 되면 그러면 이 방향으로 이 그러니까 알파벳 2라고 하는 값이 이쪽 인풋에 얼마큼 민감한가라고 하는 거를 보고 싶으면 이쪽 이쪽 아웃풋에 해당하는 c라고 하는 값에 대해서 편미분을 게 d라고 하는 값에 대해서 편입을 하게 되면 그게 c이고 c 값이 3이기 때문에 여기에서 e라고 하는 최종 아웃풋에 d라고 하는 인풋에 대한 민감도는 3이라고 생각을 할 수가 있고요. 마찬가지로 그 과정을 그다음 단계로 하고 해 나가게 되면은 최종적으로 이라고 하는 최종 아웃풋은 a라고 하는 것들에 대해서 e라고 하는 만큼의 민감도를 가지고 있고 그다음에 이라고 하는 거는 b에 대해서 5만큼이라고 하는 민감도를 가지고 있는 것을 저희가 알 수 있죠. 제가 방금 말씀드린 게 제가 뭔가 머릿속에서 많이 생각을 한 게 아니라 그냥
Attendees 1 17:02 실제 100프로 알고리즘이 동작을 하는 그 단계를 하나하나 차근차근 말씀을 드리는 거거든요. 이런 식으로 매커니컬하게 정해져 있는 알고리즘을 따라서 순서대로 계산을 하게 되면 저희가 그래디언트를 체계적으로 구할 수가 있습니다.
Attendees 1 17:20 혹시 여기서 멈춰서 잠깐 궁금하신 게 있으면 질문을 받아볼 수도 있을 것 같은데요 백럽 그다음에 그게 어떻게 자동으로 알고리즘으로 전환이 되는지에 대해서 혹시 오디언스 온라인으로 들어오신 분이나 아니면은 여기 오프라인 오신 분들 중에서 궁금한 게 있으신가요?
Attendees 2 17:56 원래 모전에 선택해야 되는 상황이 좀 있을 것 같아요. 그래서 아예 별도의 스트레스를 미리 한다.
Attendees 1 18:08 그니까 그거는 이제 제가 두 번째 섹션에서 다룰 내용이어서 그때 한번 좀 들어보신 다음에 다시 질문해 보시면 어떨까 싶은데요. 네 좋은 질문이고요. 이제 그게 실제 이제 머신 러닝 프레이목에서 이제 그런 것들을 어떻게 잘 해내느냐라고 하는 것들이 기술적인 도전이 되겠죠 혹시 뭐 다른 질문들도 있을까요? 네 그럼 모두 다 잘 이해를 하신 걸로 알고 넘어가도록 하겠습니다. 네 이런 알고리즘이 실제로 그러면 파이토치에서는 어떻게 구현되어 있나라고 하는 게 오늘의 메인 타픽이고 지금부터 저희가 그 이야기를 해볼 텐데요. 이 파이토치에서 구현한 오토 디프랜시이션이라고 하는 거를 파이토치에서는 오토 그라드라고 불립니다. 네 여기서 이제 오토 브라드라고 이름을 붙였는데 사실 이 이름이 파이토치에서 제일 먼저 쓴 건 아니고 제가 정확하게 그 부분 기억은 안 나는데 하버드 대학에서 이런 오토매틱 디퍼렌시이션을 연구를 넘 파일을 가지고 하셨던 분들이 그들의 구연을 오토 그라도가 불렀는데
Attendees 1 19:12 그걸 어찌 하다 보니까 파이토치에서도 그냥 오토 브라더라고 불려서 맨 처음에 약간 노이즈가 있었다라고 해요. 이거를 내가 오토 브라드라고 불렀는데 왜 너희도 이거를 오토 브라드로 부르냐 라고 해서 약간 그런 불평들이 있었다고 합니다. 어쨌든 네 그리고 그분들의 이제 많은 그 하버드에서 그 연구를 하신 핵심 멤버들은 구글에 입사하셔서 잭스라고 하는 팀으로 들어가셨어요. 어쨌든 네 파이토치에서는 그런 알고리즘을 이제 실제 오토브라드라고 하는 이름을 붙여서 구현을 해놨고요. 이게 이제 이거 모드에서 방금 말씀하신 그런 백 프랍을 위한 그래프를 킵을 하고 하는 이런 기술들을 다 합쳐서 파이토치에서는 오토 그라드라고 부릅니다. 오토 그라드가 하이 레벨에서 어떻게 동작을 하는지 제가 여기서 간단하게 조금 적어봤는데요. 이제 매 오퍼레이션이 이제 수행이 될 때마다 파이토치에서는 컴퓨테이션 그래프라고 해서 어떤 연산을 해 왔다라고 하는 거를 인크멘털하게 다 킵을 하게 돼 있어요.
Attendees 1 20:15 네 그게 이제 텐서에 어노테이션이 붙는 거거든요 그래서 그 텐서에 어노테이션이 붙어서 아웃풋 센서가 그 아웃풋이 어떻게 만들어졌나라고 하는 거를 기록을 하게 돼 있거든요. 그게 항상 되는 건 아니고 그 밑에 아마 제가 적었던 것 같은데 텐서별로 그래디언트가 필요한 것들만 이제 그렇게 하도록 되어 있습니다. 아까 저희가 웨이트랑 그다음에 실제 인풋해서 실제 인풋은 100g이 사실은 필요가 없죠 값이 같지 않으니까 그렇지만 웨이트는 100g이 필요하잖아요. 그래서 그 리과이어 그레드라고 하는 그런 텐서별로 플레이가 있어서 펜서가 그 플래그가 켜져 있는 것들만 쭉 이런 과정들을 하게 되어 있어요. 네 그래서 이제 그건 이제 텐서에 들어 있는 그런 어떤 플래그고 그 플래그를 보고 이렇게 실제 내가 그러면 어떻게 어떤 과정을 통해서 계산이 되었나라고 하는 거를 킵을 할 건지 팁을 하지 않을 건지라고 하는 것들을 판별을 하게 돼 있습니다.
Attendees 1 21:16 네 그게 일단 그 오토 브라드라고 하는 게 일어나는 이제 어떻게 보면 하이레벨에서 봤을 때 큰 골자라고 할 수가 있고요. 거기에 이제 실제 각 디셔블 펑션이라고 하는 것들을 실제 오토 그라도 하고 알고리즘 내에서 아까 이야기한 로그도 있고 뭐 사인도 있고 폴리노미얼도 있고 할 거 아니에요 그 저희가 보통 흔히 쓰는 수학적인 함수의 미분 형태는 사실 잘 알려져 있기 때문에 네 그런 것들을 실제 웨이트들에 대해서 복잡한 편입을 할 수 있도록 하는 그런 매스 펑션 메스 함수 메스 알고리즘 같은 것들을 구현을 해놔서 사람들이 네 미분을 센 코드로 어떻게 구현했는지가 보여 납니다. 이거 조금 있다가 말씀을 드리도록 하겠습니다. 네 다 구현을 해놨고 예를 들어서 제가 커스텀 옵을 만들었다라고 하면 그런 커스텀 옵에 대해서는 당연히 어떻게 미분할지 노트브라든가 알 수가 없을 거 아니에요. 그래서 그런 경우에는 그 커스텀 옵을 추가를 한 사람이
Attendees 1 22:13 그러면 미분은 어떻게 되는지라고 하는 것들 같이 기술을 해서 넣을 수 있도록 장치가 돼 있습니다. 이게 이제 되게 하이 레벨에서 봤을 때 오토 그라드가 어떻게 생겼나라고 하는 거를 말씀을 드린 거고요. 실제 이제 이 전표를 가지고 제가 좀 슬라이드를 조금 왔다 갔다 하면서 만들어 볼 텐데 제가 이걸 만든 지가 꽤 돼가지고 저도 이거를 보면서 기억을 해서 해야 되는데 그 왼쪽에 있는 이게 어떻게 보면 머신러닝 모델이라고 보기는 힘들지만 x라는 값이 있고 y라는 값이 있고 라고 하는 값이 있는데 x는 그냥 상수고요 x는 그냥 상수고 그다음에 제가 x가 그런데 저는 그라디언트가 필요하다라고 마킹을 해놨고요. 그런 상태에서 x의 1을 곱한 값이 y에 저장이 되고 x의 제곱을 한 값이 제가 제라고 하겠습니다. 편하게 제트에 이제 저장이 됐다라고 한다면은 그 상태에서 내가 이거를 100워드 계산을 하고
Attendees 1 23:13 그때 x의 지에 대한 그드언스 값을 구하겠다라고 하면 이제 그 값들을 하나하나 프린트를 해보면 되겠죠 네 이게 그러면 실제 프린트를 해보면 값들이 어떻게 나오냐면 x는 이었으니까 이라고 나올 거고 그다음에 제가 그래디언트가 필요하다라고 했으니까 그래디언트 값이 그드 리카이어 그레드라고 하는 그 플래그가 틀로 되어 있겠죠 그리고 봅시다. 그다음에 y는 당연히 2승을 했으니까 곱하기를 했으니까 4가 될 거고 그다음에 z는 거기에 제곱을 했으니까 이제 16이 될 거고 네 그다음에 실제 거기에 이제 그라드 값도 x에 대한 그라드 값도 이걸 실제 이제 뒤로 오면서 미분을 해보면 16이 됩니다.
Attendees 1 24:02 그럼 이게 이제 어떻게 해서 이런 일이 일어났나 라고 하는 걸 제가 하나하나 슬라이드를 넘기면서 이제 설명을 해 볼 텐데 일단 x는 이 값이 들어왔으니까 네 이라고 이제 이렇게 되어 있겠죠 네 그리고 이제 x 자체에 나는 이 값은 그레디언트가 필요해 라고 이제 마킹이 되어 있는 상태로 파이토치가 이런 상태를 저장을 할 거고요. 근데 여기서 여기서 이제 y 값으로 넘어가게 되면 첫 번째는 원래 이제 그 값을 계산을 해야 되니까 x에 2를 곱해서 4 그래서 y는 사야라고 저장을 해놓겠죠 그런데 여기서 끝나는 게 아니라 x가 미분이 필요하다라고 했고 그러기 위해서는 거기에 이제 아웃풋이 되는 y의 그라디언트가 필요하니까 y도 그래디언트가 필요하겠죠 그러면서 여기에 이제 보면은 멀 베버드라고 하는 게 이게 그니까 y에 들어간다고 봐야 되나 x에 들어간다고 봐야 되나
Attendees 1 24:59 멀티플리케이션에 의한 백워드로 y라고 하는 게 아마 y에 연결이 돼야 될 수도 있을 것 같긴 한데 어쨌든 간에 이런 백워드 과정이 필요하다라고 하는 게 여기에 이제 이렇게 등록이 되도록 되어 있어요 이게 실제로 그러면 이런 스텝이 어떻게 이제 일어나냐라고 하면은 저희가 그때 이거 모드 했을 때 디스패치 배우고 그러면서 제가 오토 그라드 커널 예제 같은 걸 들면서 한번 설명을 드렸었는데 혹시 기억이 나시는지 모르겠습니다. 이 슬라이드가 제가 거기서 썼던 슬라이드를 그냥 가져온 거거든요 그때는 아주 깊게 설명하지는 않고 넘어가긴 했는데 여기에서 이제 매직이 일어났는데요. 참고로 이 오토 그라드 커널은 사람이 딴 커널은 아니고 오토 브라드 라이브러리가 실제 그냥 자동으로 뱉어주는 코드예요. 자동으로 뱉어주는 코드라고 생각을 하시면 되고
Attendees 1 25:53 여기에서 그때 제 기억을 잠깐 저희가 기억을 살려보면 파이토치에는 디스패치 키라고 하는 개념이 있고 그 디스패치 키라고 하는 게 어떤 텐서의 상태에 의해서 어떤 펑션을 디스패치를 해야 되는지 라고 이제 결정을 하는데 그냥 크게 보면은 포드 할 때 쓰는 커널이 있고 그다음에 배고도 할 때 쓰는 커널이 있고 그다음에 그게 각각 어떤 하드에 붙어 있냐에 따라서 다른 함수들을 이제 디스패치를 할 수 있도록 되어 있는데 지금 같은 경우에는 x라고 하는 그다음에 y라고 하는 값들이 그 오토 그래드가 켜진 상태겠죠 뉴카이어 그레드라고 하는 게 있으니까 그런 상태라고 하는 것을 알고 있는 상태에서는 오토글라드 디스패치 키를 써서 디스패치를 하게 되고요. 이제 그게 어떻게 되냐면 실제 이거는 백워드에서 이런 백워드 과정에서 불리는 그런 함수가 아니라 포워드에서 애드를 처리를 하는 함수이고요. 거기에서 이 중간에 보면 어떤 일을 하냐면 컴퓨터 리어스 그레드라고 하는 부분이 있어요.
Attendees 1 26:55 위에서 하나, 둘, 셋 네 번째 줄에 있는 이 부문이 comp request grade 지금 이 계산이 내가 나중에 그래디언트를 구해야 되는 그런 계산인지 아닌지라고 하는 것들을 이제 판별을 하게 되고요. 만약에 그렇다라고 한다면은 거기에 있는 이제 그래드 펑션을 이제 찾거든요 여기서 이 그래드 펑션을 찾는 과정은 실제로 이 애드라고 하는 함수가 정해져 있기 때문에 이 애드에 대해서는 거기에 해당하는 그래드 함수가 뭐인지는 파이토치가 잘 알고 있고 거기서 여기서 이제 에드 베버드라고 하는 이런 함수를 여기에 이렇게 등록을 해 놓습니다. 그렇게 해놓고 여기 보면은 이제 넥스트 에지 이런 약간 컴퓨테이션 그래프를 만드는 것처럼 백워드 그래프를 마치 만드는 것 같은 그런 과정들을 이렇게 쭉 이렇게 기록을 해 놔요. 그 이게 분명히 이제 포워드를 지금 수행을 하는데 이 포드를 수행을 하면서 내가 나중에 백워드가 될 때 어떻게 처리를 해야 될지를 이 과정에서 먼저 기록을 해놓는 거죠.
Attendees 1 27:57 설명이 됐나요? 네 네 그리고 그거는 이 디스패치 키 자체가 오토 그라드 퍼너를 쓰도록 설정이 돼 있기 때문에 가능한 거고 그걸 이제 판별하는 과정이 판별하는 함수가 여기에 있는 컴퓨터 리카이어 그래드라고 하는 부분이에요. 이렇게 해서 일단은 100원에서 일어난 일들을 일단은 기록을 해놓은 다음에 그다음부터는 실제 이제 포드 계산을 하게 되죠. 혹시 이 부분에서 질문 있으십니까? 여기서 지금 질문을 하셨던 게 하나는 특정 페어런트 노드가 리어 그레드 2이면 그쪽과 연결되는 차일드 노드들은 자동으로 되나요? 네 그렇습니다. 네 그러니까 실제 이제 포드 그래프를 생각을 했을 때 인풋에 해당하는 어떤 값들 중에서 나는 그레디언트가 필요해라고 이제 연결이 돼 있으면 이 인풋으로부터 영향을 받는 모든 변수들은 사실 그러면 네 되어 있어야 될 것 같고요. 네 그래서 그 부분은 실제로 파이토치가 따라가면서 자동으로 브랜드 리얼 그레드를 세팅을 하도록 되어 있습니다.
Attendees 1 29:02 이건 제가 답을 한 것 같고 이전에 아까 보면은 미분을 센 코드로 어떻게 구현했는지가 보여집니다라고 하는 거에서 이 센 코드라고 하는 게 어떤 걸 의미를 하시는 거죠? 그게 결국에는 파이터치 옥이죠 그러니까 그 미분 함수라고 하는 것도 결국에는 함수니까 함수인데 파이토치 옥들이 함수잖아요. 그러니까 여기 지금 나와 있는 것처럼 에드 백워드 제로라고 하는 이제 파이토치 에 이제 매핑을 하는 거고 에드 백워드 제로라고 하는 그 함수도 마찬가지로 파이토치가 베어낸 옷일 거예요. 아마 여기 제가 지금 잘 기억이 안 나는데 그 파이토치가 옷별로 야멜 파일들이 되게 몇 가지가 있거든요 그중에 하나가 오토브라드 야멜이었나 아무튼 잘 기억이 안 나는데 데래버티브 점 야멜이라고 하는 파일이 있고요. 그 안에 보면 그런 이제 파이토치 기반에서 기본적으로 쓰는 옷들에 대한 립은 정리가 되어 있고요. 그걸 읽어가지고 이제 파이토치가 이런 함수들을 자동으로 뱉어내게 되어 있습니다.
Attendees 1 30:15 네 이게 그럼 여기 나와 있는 질문 두 개는 제가 답을 다 한 것 같습니다. 그럼 다음 페이지로 넘어가도록 하겠습니다. 근데 이제 여기 제가 적어놨던 것처럼 이 이건 약간 올드 스타일의 제너레이션 코드를 제가 그냥 찾아가기로 한 거고요. 최신 버전에서는 여기에서 밑에 보는 부분이 다시 한 번 이렇게 리디스패치를 하는 과정으로 그 함수가 박혀 있는 게 아니라 다시 한 번 디스패치 키를 찾아가지고 뭔가 하는 그런 과정으로 바뀌어 있는 걸로 기억을 합니다. 여기서 제가 작업을 안 했네요. 네 코드 젠 된 이점프를 넣기라고 해놓고 제가 까먹었네요. 여기서 제가 아마 에드 백워드 제로라고 하는 부분에 코드를 넣는다고 하는 게 제가 까먹었습니다. 다음에 다시 넣어 놓도록 하겠습니다. 네 이렇게 됐어요. 이렇게 되고 그러면서 마찬가지로 제가 이렇게 그림을
Attendees 1 31:19 넣은 이유를 알겠네요 네 여기에서는 실제로 파워 백워드 값에 들어가는 그 실제 이 함수에 들어가야 되는 인풋이 y고 x여서 제가 이렇게 해놨던 것 같습니다. 어쨌든 익스텝을 그다음에 또 반복을 하는 거죠. 그래서 zet는 y의 제곱이라고 하는 거를 보면은 y의 제곱이라고 하는 부분이 아까 제가 말씀드렸던 오토 브라드 커널이라고 하는 부분에서 ET도 y와 zet도 이제 오토 브라드가 필요하구나라고 하는 것들을 이제 인지를 해서 실제 아까 그 이프문 안으로 들어가고 그 그래디언트 펑션이 정해져 있는 것들을 이제 다시 이제 부키핑을 해놓고 그다음 단계로 또 이제 넘어가게 됩니다. 이 스텝을
Attendees 1 32:06 하게 되면 이제 제트까지는 계산이 된 거고요. 그다음에 이제 백워드를 하게 되는데 이제 백워드는 마찬가지로 거꾸로 이제 이 과정을 다시 복귀를 하는 거거든요. 아까 이제 제가 그전에 백 프로케이션 이야기하면서 아웃풋에 대한 그 자신에 대한 표미분은 1이라고 이야기를 했잖아요. 그래서 실제로 1이라고 하는 상수부터 시작을 해요. 그래서 1이라고 하는 상수가 들어오고 그다음에 그 파워 백 워드 파워가 왜 1위 파워인지는 모르겠지만 아무튼 파워 백워드라고 하는 함수가 실제로 여기에서는 y 제곱에 대한 미분 함수이기 때문에 e y라고 하는 값이고요. 이 y라고 하는 값은 위에 들어오는 인풋이랑은 상관없이 그냥 y 값에만 의존을 하는 거고 y 값이 그 상태에서 사기 때문에 곱하면 팔게 되겠죠 네 그래서 이 값에 이제 100워드로 흘러 들어가야 되는 값은 이제 8인 거고요. 그리고 실제 그다음 단계로는 x에 이제 편미분을 해보면은 그냥 이 이죠
Attendees 1 33:17 e 이 위에서 오는 건 그냥 곱하는 거죠. 그러니까 위에서 온 민감도가 계속 누적이 되면서 곱해지는 과정이니까 그 전에서는 일이기 때문에 곱하면 그냥 팔이 나오는 거고 그 밑에서는 이제 위에서 온 민감도는 8인 거고 그 8에 평균 함수인 2를 곱하게 되면 이제 16이 되고 그래서 그 16이 최종적으로 x의 그래디언트 값이 되게 됩니다. 그래서 결과적으로 프린트 x 그레이드를 하게 되면은 16이 튀어나오게 되는 거죠. 제가 잘 설명이 됐는지 모르겠습니다. 네네 이렇게 실제 이제 훨씬 더 복잡한 모델들에 대해서는 지금 제가 말씀드리는 것보다 훨씬 더 복잡하게 과정이 보이긴 하지만 근본적으로는 제가 방금 드린 말씀드린 이런 일들이 계속해서 반복적으로 일어난다고 생각을 하시면 됩니다. 이거를 실제 이제 이 백워드라고 하는 게 방금 제가 말한 것들이 이제 어떻게 일어나는지라고 하는 것들을 한번 실제 코드를 읽어보시면
Attendees 1 34:25 이 백워드라고 하는 함수가 있고요. 네 그다음에 그 함수가 실제 이 c 풀풀 수준으로 내려가서 보게 되면 런 백워드라고 하는 함수로 되고 그 런 베거드라고 하는 함수가 결국에는 그래디언트 오토그라드 엔진에 해당하는 엔진이라고 하는 클래스에 엑스큐트라고 하는 펑션을 두게 되는데 함수 그 펑션이 이제 실제 그래프 테스크라고 하는 거를 만들어요. 그래서 이니트 x라고 하는 거는 이 그래프 단 테스크에서 실제 등록이 되어 있는 함수들을 쭉 이제 보면서 실제 계산을 하기 위한 백워드를 계산을 하기 위한 그런 이 함수를 만들게 되고요. 그 함수를 만든 다음에 그 함수를 실제 이제 실행을 하게 되면 거기에 이제 이벨루에이션 펑션 이라고 하는 것들이 불리면서 실제 이제 거기서 저희가 아까 이야기했던 백워드 제료 이런 함수들이 쭉 불리면서 실제 그레드 펑션들이 계산이 되게 됩니다.
Attendees 1 35:19 이건 궁금하신 분들은 제가 힌트가 되는 링크들은 여기다 받아놨으니까 클릭을 하셔 가지고 코드를 따라가 보시면 될 것 같습니다. 실제 이 방금 말한 우토 그라드 엔진이라고 하는 많은 부분들은 랩퍼는 파이썬으로 있긴 하지만 실제 다 시플 코드로 짜져 있습니다. c플 풀 코드로 짜져 있는 게 실제 그 하나하나의 그래드 펑션 자체는 예를 들어서 이게 지금 gq에서 돌게 되면 골라 결국에는 디펙츠 키에서 골라지는 그런 함수들은 결국에는 GPU에서 코다 코드를 돌리게 되겠지만 그런 것들을 계산을 하고 전체 실행하는 체계 자체는 다 스플플로 짜져 있다라고 생각을 하시면 돼요.
Attendees 1 36:04 여기서 웅원 님께서 질문을 하셨는데요. 네 해당 코드의 중간 부분에 100 프로퍼게이션에 대한 준비 하는 부분에 대해서 말씀하셨는데 그러면 이거 모두에 해당 부분도 함수가 코할 때마다 반복적으로 수행되게 되는데 비효율적으로 보이는데 이거 모드와 그래프 모드의 동작이 다른 거겠죠 잠깐만요 제가 지금 이게 어떤 말씀인지 제가 잘 이해가 안 가서 다시 한 번 읽어볼게요.
Attendees 1 36:38 예 준비하는 과정이 매번 불리게 되긴 하는데 실제 그 매번 불릴 때마다 준비하는 과정에서 일어나는 일은 그냥 그래디언트 펑션을 골라가지고 등록을 하는 과정이거든요. 그 과정 자체가 그렇게 해비한 과정은 아닌 것 같아요. 그래서 엄청 비효율적이라고 저는 보이진 않긴 하거든요. 혹시 이 질문을 하신 분께서 동의하시는지 말씀을 해 주실 수 있으세요? 마이크를 키고 한번 말씀을 해 주실 수 있으신가요? 제가 혹시 잘못 이해하고 있는지 질문을
Attendees 1 37:19 네 답이 없으세요 네 아무튼 제 생각에는 니 어느 정도 비효율적인 부분이 있긴 한데 그게 엄청나게 비효율적이라고 생각은 들지 않거든요. 왜냐하면은 그런 컴퓨테이션 그래프를 만드는 거는 그냥 그래드 펑션을 찾아가지고 등록을 하는 과정이어서 그게 실제로 엄청나게 복잡한 멤머를 하고 하는 그런 거는 아니거든요. 그리고 이 반복적으로 수행을 하긴 하지만 어떻게 보면은 실제 컨설턴트 오 원 짜리 일을 하는 거여서 저는 그게 엄청나게 비효율적이라고 생각은 들지 않습니다. 이거 모다 그래프 모드의 동작이 하는 방식에 대해서는 뒤에서 설명을 할 거기 때문에 그때 한번 제가 설명을 하고 혹시나 더 궁금한 게 있으시면 그때 질문을 하시면 될 것 같습니다. 그리고 파이토치 10 오토그라드라고 말씀해 주셨는데 해당 코드는 최신 파이토치에서도 사용되는 방법인가요?
Attendees 1 38:12 네 그러니까 오토 그라드가 이거 모드로 지원을 하는 게 파이토치 10에서 굉장히 중요한 기능이었고요. 예 그게 지금도 마찬가지로 똑같은 방법식으로 네 네 답을 여기 해 주셨군요. 네 알겠습니다. 네 사용되는 방법입니다. 네 아마 뭔가 코드가 업데이트되긴 했지만은 제 생각에 거의 큰 틀은 바뀌지 않고 지금도 유지가 되고 있을 거라고 생각을 합니다.
Attendees 1 38:44 그럼 지금까지는 이거 모드에서 이제 그 오토매틱 디퍼렌시이션이 오토 그라드라고 하는 그런 기능을 통해서 어떻게 구현이 됐는지라고 하는 걸 제가 말씀을 드렸고요. 여기서 은지 님께서 이제 더 디테일로 들어가기 전에 그 1 0과 2 0에서의 가장 큰 차이점이 무엇인지 설명을 해 주시면 좋다라고 했는데요. 제가 잠깐만 이게 뒷부분에서 커버가 될 수도 있긴 한데 일단은 그거에 대해서 먼저 좀 말씀을 드리면 일단 그래프 모드와 이거 모드의 가장 큰 차이는 이 포워드를 할 때 그래프 모드에서는 먼저 페이크 텐서를 이용을 해서 약간 빠르게 포드를 에뮬레이션을 하면서 실제 그 계산이 어떻게 생긴가에 대한 전체적인 스케치를 한번 하잖아요 그렇죠 그다음에 그 스케치가 돼서 온 결과를 FX 그래프라고 하는 걸로 결국에는 캡처를 하고 그 FX 그래프를 백엔드 컴파일러에 던져주면 이제 컴파일을 한 다음에 정말 이제 실제 원하는 그래프 모드 계산이 일어나게 되잖아요 그렇죠
Attendees 1 39:56 그게 이제 파이토트에서 말하는 그래프 모드인데 그러면 그렇게 동작하는 그래프 모드에서는 그러면은 오토매틱 디프랜시이션이 어떻게 돼야 되느냐라고 하는 거를 이제 생각을 해보면 되는데 뭐 예를 들어서 그러면 어떻게 가능할까요? 아까 제가 이야기한 오토 그라드라고 하는 게 이거 모드에서 수행을 하는 거는 오토 그라드 커널이 있어서 그 커널이 실제 포드 계산을 하기 전에 중간에 내가 이게 오토 그라드가 필요한 그레이드가 필요한지 아닌지 판명을 해가지고 백어드 계프를 그때 만들잖아요 그러면은 저희가 다이나모르 트레이스를 하는 과정에서 그러면은 백워드 그래프를 생성을 하면 될까요? 예를 들어서
Attendees 1 40:49 뭐 그런 것도 하나의 방법일 수도 있는 거고요. 그렇죠 아니면 또 다른 방법이 뭐가 있을까요?
Attendees 1 41:02 아이디어 주신 분 아니면 내가 하고 싶은 계산이 결국에는 다이나모를 거치게 되면 FX 그래프로 튀어나오잖아요 그러면 실제로 딱 제가 계산할 포드 그래프가 에x 그래프인 거잖아요 그러면 그 FX 그래프가 어떻게 생겼는지를 알고 그 사람에 그러면 그거 배워드가 어떻게 될까라고 하는 거를 판별을 하는 게 그러면 더 나을 수도 있는 거 아니에요 그러면
Attendees 1 41:36 네 실제로 전자 그러니까 페이크 모드로 페이크 텐서를 이용을 해서 트레이싱을 하는 과정에 과정에 이거 모드를 같이 이거 모드에 오토 그라드를 같이 붙여가지고 하는 게 동작을 잘 할 수도 있고 제 생각에는 잘 안 할 수도 있고 아무튼 뭔가 굉장히 좀 복잡할 것 같긴 해요. 왜냐하면 제가 깊게 생각을 해보진 않았는데 오토 그라드라고 하는 거는 페이크 텐서를 가지고 동작하는 게 맞는 건 아니고 실제 텐서 값들을 다 계산하는 과정에서 만들어 놓은 이런 애들인데 그런 애들을 다이나모에 페이크 텐서를 통해서 트레이스를 만드는 과정에서도 또 똑같이 동작하도록 만드는 게 이거 모드에서 잘 돌라고 만들어놓은 오토 그라드를 별로 수정하지 않고 그대로 사용할 수 있는 거야 라고 하는 거에 대해서 제가 뭐 이렇게 모르겠어요. 지금 당장 말씀드리기는 어려울 것 같거든요. 근데 그게 그렇게 아비오스하게 그냥 잘 동작을 할 것 같지 않다는 생각이 들거든요.
Attendees 1 42:35 생각을 하나하나 꼼꼼히 해보면 그런 방법이 있을 수도 있긴 하겠지만 제 생각에는 그렇지 않게 될 확률도 있는 것 같아요. 하지만 네 일단은 FX를 그래프를 만들고 나면 그러면 복잡한 부분들은 다 날아간 거고 실제로 제가 계산을 할 부분들에 대해서는 남아 있으니까 네 그러면 그다음에 가지고 이 부분들에 대해서는 네 백오드 그래프를 그때 만드는 게 또 나을 수도 있지 않을까요? 이렇게 되게 되면 그러면 제 생각에는 어떤 일들이 가능 이런 것도 생각해 볼 수가 있겠네요. 저희가 다이나모으로 트레이스를 하는 과정이 전체 계산을 하나의 트레이스로 다 만드는 게 아니라 중간중간에 이거 모드로 돌아야 되니까 파이돈으로 돌아야 되는 그런 파이선이라기보다 이거 모드로 수행을 할 파이썬 코드가 중간중간에 튀어나오게 되잖아요. 그러니까 어떻게 보면 포드 자체가 쭉 그래프 모드가 아니라 이거 모드로 돌았다가 그래프 모드로 돌았다가 이거 모드로 돌았다가 그래프 모드로 돌았다가 라고 하는데 그러면은
Attendees 1 43:35 그런 과정에서 저희가 만약에 트레이스를 하는 과정에서 뭔가 이거 모드에서 만들어낸 오토 글라드를 돌리게 되면 그러면 어떻게 되는 거죠? 백워드 그래프 도대체 그러면 어떻게 만들어지는 걸까요? 좀 복잡한 것 같아요. 네 좀 복잡한 것 같다는 생각이 좀 들거든요. 그래서 그렇게 생각을 하는 것보다는 에x 그래프로 만들어진 그 부분이 그냥 이것 모드로 봤을 때는 그냥 하나의 오이라고 생각을 하면 저는 좀 간단해지는 것 같거든요. 그렇죠 그래서 실제로 트레이스를 통해서 튀어나오는 게 전체적으로 봤을 때는 그냥 이거 모드로 수행이 되는데 그중에서 FX 그래프로 묶여진 거는 어떻게 보면 새로 만들어져 합성한 하나의 굉장히 큰 오이고 그럼 그 큰 오에 대한 립은 값을 입은 함수를 우리가 알고 있으면 그러면 그냥 이거 모드로 쭉 수행을 하면 그러면은 자연스럽게 백워드 수행이 될 거 아니에요 생각해 보니까 그렇네요. 네 그래서 그런 이유로 IoT 오토브라라는 거를 만들게 됐고
Attendees 1 44:45 뭐 그런 것들에 대한 내용들을 제가 이 뒤에다가 적어놓은 것 같습니다. 설명이 됐는지 모르겠습니다. 네 제가 방금 말씀드린 것처럼 이해를 하는 게 저는 더 좋을 것 같다는 생각이 듭니다. 럼 제가 지금 말씀드린 거를 하나하나 풀어가지고 좀 설명을 해보도록 하겠습니다. 일단 기억을 되살려서 왼쪽에 있는 이런 함수 이런 파이썬 코드가 있다라고 생각을 해보면 저희가 이제 실제 트레이닝을 하려고 하는 그런 모델이 여기서 그냥 모델이라고 표현이 되어 있고 거기에 어떤 인풋이 들어와서 어떤 아웃풋을 구하고 근데 이걸 제가 저희가 지금 트레이닝을 하기 위해서 오토 그드 리카이어 그래드를 켜놨다라고 생각을 한 다음에 output이 나오면 그 실제 기대하는 레퍼런스와 차이 값을 여기서는 이제 크로스 엔트로피를 구해서 노스를 구하면 로스에 이제 백워드를 하게 되면 이 과정에서 만들어진 그 백워드 그래프가 축생이 되면서 그래디언트 값들이 구해지겠죠
Attendees 1 45:50 그게 일단 왼쪽 코드를 저희가 이거 모드로 이제 구현을 하게 되면 일어나는 일이거든요 이거를 저희가 그래프 모드에서 그러면 이거를 트레이닝을 한다라고 하면 코드를 어떻게 바꿔야 되냐면 일단 모델을 먼저 컴파일을 해야겠죠 그래서 모델을 특정 컴파일을 통해서 컴파일을 하고 근데 실제 이 컴파일은 백엔드 컴파일로 된 컴파일이 아니라 다이나모나 기타 등등을 하기 위한 준비가 되어 있는 모델이라고 생각을 하면 되는 것 같고 그 준비가 되어 있는 모델을 실제 수행을 하면 그 단계에서 다이나무가 트레이싱을 하면서 실제로 저희가 가독할 수 있는 부분들을 FXGF로 만들어 놓은 그런 과정들이 일어나면서 실제 아웃풋도 계산을 해서 이제 아웃풋이 나오고 그 아웃풋으로 로스를 구한 다음에 그다음에 이제 베어드를 하면 되겠죠
Attendees 1 46:43 까 겉에서 볼 때는 실제 안에서 제가 방금 아까 말씀드린 그런 복잡한 일이 어떻게 일어날지는 모르겠지만 이제 사용자가 봤을 때에는 그래프 모드에서 트레이닝을 한다라고 하면은 오른쪽처럼 그냥 코드를 짜면 됩니다. 이건 제가 세미님께서 질문하신 건 제가 좀 나중에 다시 한번 답을 보고 하도록 하겠습니다. 네 근데 오른쪽 이 어떻게 그러면은 제가 아까 이야기 약간 복잡하게 이야기한 그런 과정들이 일어나게 되는 건가라고 하는 게 그렇게 아비어스하게 보이지는 않거든요 오른쪽에서 하지만 어쨌든 간에 토트점 컴파일이라고 하는 게 모델을 컴파일을 하니까 그냥 여기에서는 그냥 모델을 쓰는 게 아니라 컴파일드 모델을 쓰면 뭔가 알아서 되면 좋은 거 아니에요 그럼 그 뭔가 알아서 잘 되도록 하기 위해서 일어나는 그런 과정들을 지금부터 제가 말씀을 드릴 텐데 압력하진 않아요. 여기 보면 되게 이제 복잡한데 트레이닝을 그러면 토치 점 컴파을 하게 되면 실제로 이제 어떤 일들이 일어나게 되냐면
Attendees 1 47:43 제가 여기서 이제 스텝을 세 개로 나눠서 이야기를 한 것 같아요. 저도 이게 만든 지 돼서 읽어보면서 다시 복귀를 해야 되는데 첫 번째로는 일단 다이나모의 산출물인 FX 그래프가 아까 제가 말씀드린 것처럼 오토 그라드에 의해서 컴파일된 포드와 백워드를 모두 포함하는 그런 토치 점 오토 그라드 점 펑션이라고 하는 것들로 변환을 해요. 혹시 이게 어떤 이야기인지 이해를 한 번에 하실 수 있으면 좋겠지만 못 하셔도 제 생각에는 상관 없는 것 같습니다. 그리고 이 부분에서 실제 포드 부분은 이제 이 단계에서 실행이 되고 그다음에 아웃풋의 백워드 부분은 컴파일 된 백워드 가 갖게 되고요. 그다음에 로스 계산은 오토 그라드가 적용이 되어 있긴 하지만 그 이제 이거 모드로 일단은 이제 수행이 된 다음에 로스 펑션은 로스 펑션의 그래드 펑션이라고 하는 게 이제 만들어지게 되고 두 번째 단계에서 만들어진 그 로스 펑션의 이제 그래디언트 펑션이 첫 번째 단계에서 만들어진 모델의 컴파일드 베어드를 이제
Attendees 1 48:56 큰 오이라고 생각을 하고 부르게 되면은 그러면 실제로 이제 모델들의 업데이트를 해야 되는 그래던 값이 이제 계산이 되게 됩니다. 이게 잘 전달이 되는지 모르겠어요. 다시 한 번 한번 시도를 해볼게요. 그니까 이 컴파일드 모델이라고 하는 게 오토 그라드를 한 다음에 켜놓은 다음에 수행을 하게 되면 결과적으로는 얘를 뭐라고 예를 하게 하면 되냐면은 토치 파이토치에서 정의한 토치 점 오토그라드 점 펑션이라고 하는 오브젝트로 바뀌거든요. 그 오브젝트가 뭐냐 하면 아까 제가 이야기한 그런 커스텀 옵의 미분 함수를 이제 갖다 붙일 수 있다라고 말씀을 드렸잖아요 제가 그걸 아까 사실 이것 때문에 강조를 해 놓은 건데 이 파이토치 10 오토 그라드 이야기를 하면서 이제 세 번째 블랙 포인트로 커스텀 디퍼런셜 펑션을 이제 붙일 수 있는 그런 기능이 있다라고 하는 걸 살짝 그때 언급만 하고 넘어갔는데 요 기능을 그대로 사용을 하는 거죠.
Attendees 1 49:58 그 기능을 사용을 해서 마치 이 모델이 하나의 어떤 리분 가능한 함수 커스텀 펑션이 들어 있는 그런 오브젝트인 것처럼 이렇게 만들어 놓고요. 데 그 오브젝트에는 포드로 계산하는 부분이랑 그다음에 실제로 백워드를 계산하는 부분이 다 붙어 있어요. 그래서 커스텀 컴파일드 모델이라고 부르게 되면 실제로는 그 여기 토스점 로트브라드 펑션의 포드 부분이 이제 실제로 호출이 돼서 포드 계산이 진짜로 이루어져요. 그러면서 아웃풋의 그레드 펑션으로도 이 컴파일드 모델의 백워드가 웃게 되는 거죠. 왜냐하면 이 아웃풋의 그래 펑션을 백워드를 하기 위한 그 모든 것들이 이 컴바드 모델의 100어드라고 하는 함수에 다 들어 있기 때문에 걔가 아웃풋이라고 하는 함수에 그래드 펑션이 되는 셈이죠. 그 상태로 킵을 해서 두 번째 단계로 넘어가게 되면 그러면 아웃풋에는 실제 아웃풋이 들어 있기 때문에 그걸 가지고 엔트로피 계산을 할 수가 있고요.
Attendees 1 50:58 네 그 과정에서 여기 다 리화이어 그래드가 다 켜져 있기 때문에 아웃풋에 들어 있던 그래드 펑션이 노스 펑션의 그래드 펑션으로 이제 연결이 되면서 실제 노스 점 백워드를 하게 되면 실제 로스 펑션의 백오드 부분하고 그다음에 그것에 인풋이 됐던 아웃풋의 백오드 부분이 컨티스페이션이 돼가지고 순차적으로 거꾸로 이제 부르게 되는 거죠. 그게 실제 이제 일어나는 일이라고 생각을 하시면 됩니다. 그리고 제가 이 윗부분에 이렇게 표시를 해 본 부분이 제가 아까 말씀드렸던 이 컴파일드 모델이라고 하는 게 대충 이렇게 생각을 하셨다고 생각을 하시면 되거든요. 그러니까 오토 그라드에 의해서 생성된 그 오브젝트에 스 커스텀 디서 펑션을 붙일 수 있는 토치 오토브라 점 펑션이라고 하는 그런 타입을 가지고 있고 걔는 포드 부분과 베워드 문을 다 가지고 있어요. 그래서 실제 이 컴파일드 모델이라고 하는 걸 부르게 되면
Attendees 1 52:03 둘 다 가지고 있지만 포드 부분만 호출이 되는 거고 실제 이제 백워드가 됐을 때 이거 이제 한 스텝으로 이 백워드 함수가 이제 호출이 되는 셈이죠.
Attendees 1 52:16 네 이게 이제 전반적으로 일어나는 과정입니다. 이걸 저희가 조금 더 그러면 쪼개서 아마 설명을 이제 해볼 텐데 오토 그라드라고 하는 a 오토 그라드라고 하는 파이토치 20에서 새로 추가가 되는 기능이 방금 제가 말씀드린 이런 과정들을 하는 큰 엔진이라고 생각을 하면 되고요. 그게 하는 일은 뭐냐 하면 NN 모듈이 들어오게 되면 다이나모라고 하는 애가 이걸 트레이싱을 하잖아요. 그래서 트레이싱을 해서 FX 그래프를 만들어주죠. 이건 저희가 그래프 모드를 할 때 한번 다뤄봤으니까 이 부분에 대해서는 다들 잘 이해를 하고 계실 거라고 생각을 하고 지 이렇게 FX 그래프가 들어왔을 때 실제 이게 트레이닝 모드에서는 그냥 컴파일러로 넘어가는 게 아니라 aot 오토 그라드라고 하는 기능을 통해서 뭔가 작업이 이루어진 다음에 이게 아까 제가 말씀드린 포드 백어드를 모두 다
Attendees 1 53:10 가지고 있는 그런 토치 점 오토 드 점 펑션이라고 하는 오브젝트를 이제 생성을 하게 되고 이 상태에서는 이미 포드 부분과 백오드 부분에 백엔드 컴파일러가 적용이 돼서 컴파일된 형태로 들고 있습니다. 그래야지 그 컴파일드 모드를 리턴된 거를 호출했을 때 가속이 된 포오드와 백워드를 수행을 할 수가 있겠죠 네 다시 말씀드리면 오토 그라드가 터진 그니까 트레이닝 모드에서 저희가 토지성 컴파일을 이제 부르게 되면 그러면 FX 그래프가 만들어진 다음에 그다음에 제가 말씀드린 이런 aot 오토 그라드라고 하는 백드 백엔드 컴파일러가 부르기 전에 호출이 돼서 걔가 포드뿐만이 아니라 백어드 부분도 같이 만들게 되고 포드와 백워드를 따로따로 컴파일을 해서 그 두 개를 다 등기고 있는 토치 점 오토브라드 점 펑션이라고 하는 오브젝트를 만들어서 리턴을 하게 됩니다. 네 이게 이게 방금 제가 이 전에서 이 전 페이지에서 말씀드렸던 거를 제가 다시 한 번 설명을 드린 거라고 생각하시면 될 것 같고요.
Attendees 1 54:16 이게 이제 뭐 그럼 왜 어렵냐라고 이제 생각을 해보면은 일단 아까 제가 말씀드린 것처럼 이제 오토 브라도라고 하는 엔진은 스플풀로 구현이 되어 있어요. 그런데 다이나모는 저희가 트레이싱을 하는데 이게 스플플을 트레이싱 하는 게 아니라 파이톤 수준에서 트레이싱을 하잖아요 다이나모 자체가 이제 그 파이톤 인터프리터 자체에 이렇게 딱 어떻게 보면 익스텐션 시키면서 동작을 하는 거여서 스플플 트레이싱을 잘 해주지는 않거든요. 일단 이게 어떻게 생각해 보면은 이거 모드에서의 오트 브라드는 아니죠 이게 어떻게 보면 이 그래프 모드로 실제 다이나믹 써서 트레이싱을 하는 것과 비슷하게 백워드로 비슷한 것들을 해야 되는데 라고 하는 것들의 이제 차이점 중에 하나라고 저희가 생각을 할 수가 있고요. 그다음에 이제 두 번째는 다이나 다이나모가 이제 생성한 FX 그래프에 들어있는 옷들이
Attendees 1 55:13 생각보다 꽤 복잡해요. 여기에 이제 파이썬에는 옷 자체도 이제 수천 개가 들어 있고 그다음에 이거 모드가 가지고 있는 여러 가지 이런 복잡한 이런 것들이 있는데 이런 것들을 어떻게 그럼 소화를 해낼 거냐라고 하는 게 또 이제 다른 하나의 챌린지가 되죠. 제가 정확하게 정확하게 사실은 잘 모르겠는데 그럼 왜 이런 것들이 이런 복잡한 것들이 이거 모드에서는 그럼 문제가 안 되는 거야라고 생각을 할 수가 있는데 이거 모드에서는 이런 것들을 해결하기 위한 껍데기들이 디스패처 안에 다 들어 있거든요. 그래서 그런 것들을 다 레버리지를 하면서 그 안에 있는 알맹이만 저희가 베어드 함수를 제너레이션 해서 사용하면 되기 때문에 이런 복잡성은 그냥 이거 모드가 가지고 있는 전체적인 틀에서 해결을 해 주기 때문에 그런가라고 하는 생각이 들긴 하는데 제 답에 저도 확신은 없습니다. 근데 제가 그건 깊게 고민을 해 보지 못해서
Attendees 1 56:05 제가 확실 있는 답을 오늘 들으시면 될 것 같아요. 아마 좀 관심 있는 분은 공부를 하셔가지고 제게 알려주시면 감사하겠습니다. 이런 문제들을 이제 a 오토그라드는 어떻게 해결을 하냐면 첫 번째는 이 베버드를 파이썬 수준이 아니라 이제 스플플 수준에서 디스패츠 수준에서 트레이싱을 함으로써 해결을 합니다. 그러니까 여기서 이제 다이나모로 포드 FX 그래프를 일단 생성을 하고요. 그다음에 그 생성된 FX 그래프를 스플 수준에서 오토 그라드 엔진을 사용을 해서 실제 이제 백워드로 수행을 하면 그때 어 다시 한 번 생각해 보니까 이 여기서 백워드는 아마 페이크 펜서 가지고 백워드를 하게 될 것 같긴 한데 아무튼 하면 그대로 시플플 디스패처 수준에서 그럼 트레이스가 가능 하게 됩니다. 요거에 대해서도 아마 제가 잘 기억이 안 나지만 슬라이드를 조금 적어놨을 것 같아요.
Attendees 1 57:05 어쨌든 간에 그 실제 디스펙터라고 하는 것 자체가 스플플로 되어 있는 엔진이고 그다음에 오토그라드라고 하는 게 스플플로 되어 있는 엔진이긴 한데 이제 FX 그래프를 받은 것 자체가 이제 스플풀 오브젝트로도 이제 표현이 되고 거기에 얘를 실제 이제 오토그라드 엔진을 그 스플풀 수준에서 그냥 돌려가지고 수행을 하게 되면은 거기에서 원래 이제 스플 풀에 있는 껍데기 함수들이 하나하나 호출이 되면은 걔네들이 되면서 그때 이제 이거 모드 기억나실지 모르겠지만은 결국 디스패치가 되는 부분으로 흘러 들어오게 되고 그때 키만 디스패치 키만 잘 셋업이 돼 있으면은 노트 브라드 코너를 부르게 되겠죠 그럼 자연스럽게 거기에서 그때 들어온 텐서 무객수들에 다 이런 베거디 함수들이 붙어가지고 마찬가지로 저희가 파이존에서 하는 것과 똑같은 트레이싱을 해낼 수가 있습니다. 그다음에 두 번째 문제는 어떻게 해결하냐면 그 오토 그라드의 큰 기능 중에 하나가 FX 그래프를 노멀라이제이션 하는 기능이 들어 있어요.
Attendees 1 58:07 그래서 이거를 실제 이제 구현할 수 있도록 구현을 해놨고 그런 것들을 통해서 이제 문제를 해결을 합니다. 이것들에 대해서 조금 더 자세하게 자세히 다뤄보도록 하겠습니다. 시간이 좀 많이 지났는데 좀 빨리 속도를 내보도록 하겠습니다. 오토그라드가 어떻게 생겼는지 그림을 제가 하나 찾아가지고 이제 붙여봤는데요.
Attendees 1 58:45 일단 오토 그아드
Attendees 1 58:53 리카이어 그라드가 이제 켜 있는 그런 인풋 센서들이 이제 딱 이렇게 들어오게 되면은 그러면은 이게 이제 FX 그래프
Attendees 1 59:11 이게 이제 FX 계프로 이제 만들어지게 되고요. 뭐 다이나마 의해서 이제 FX 계프로 이제 만들어지게 되고요. FX 그래프로 들어온 그래프를 이제 펑셔널라이제이션 디컴포지션 같은 노멀라이제이션을 해서 약간 더 간단한 그래프를 만든 다음에 그거를 제가 방금 말씀드린 그런 트레이싱 스풀풀 수준에서 하게 되면 여기에서 이제 4오드 그래프와 백오드 그래프가 동시에 만들어지게 되고 그것들을 이제 컴파일을 각각 하게 되고요. 그다음에 그거를 실제 오토그라드 펑션으로 이제 매핑을 해가지고 리턴을 하게 되면 그러면 이제 아까 말씀드린 그런 AP 오토 그라드가 이제 들어오는 FX 그래프를 실제로 이제 피워드와 백워드 둘 다 들고 있는 토치 점 오토 그라드 점 펑션이라는 오브젝트로 만들어지게 되는 그런 과정입니다. 다시 한 번 보니까 이게 그렇게 설명이 친절하게 되어 있진 않네요. 네 그러면 이거는 넘어가고 제가 좀 더 자세히
Attendees 1 1:00:11 브레이크 다운을 해 놓은 이 부분을 가지고 좀 더 설명을 해드릴게요. 오토 그라드가 이제 어떻게 동작을 하냐면 안에 보면 첫 번째로 다이나모가 생성하는 FX 계를 인풋으로 봤고요. 그다음에 포드와 백오드를 합친 조인트 함수를 이제 생성을 해요. 네 그게 이제 두 번째 과정이고 그때 아까 제가 이야기한 그 디스패치 기능을 이용해서 트레이싱을 하는 게 이제 포함이 되고요. 그래서 포드와 백워드가 합쳐진 거를 다시 노멀라이즈를 합니다. 노멀라이즈를 해서 펑셔널라이제이션이라든지 하는 이런 것들을 통해서 그래프를 이제 심플하게 만든 다음에 b 단계에서는 제가 다시 백업을 할게요. b 단계에서는 트레이싱이 일어나는 건 아니고 트레이싱을 할 트레이싱을 할 그 함수를 포드와 백오드를 통해서 합쳐가지고 그냥 일단은 만들어놔요. 만들어놓고 그걸 그냥 콜을 하면 한 번에 트레이싱이 일어나게 돼 있거든요. 설명이 됐나요?
Attendees 1 1:01:15 까 이게 실제 코드를 제가 저 뒤에 밑에 있는 걸 보는지 모르겠는데 어쨌든 백어드를 들게 만드는 과정 자체가 시플 플로는 이제 그라드라고 하는 함수가 있는데 그 그래드 함수하고 실제 포드 함수를 백트 백으로 부르는 새로운 함수를 이제 파이썬 수준에서 만들어서 걔를 한 번만 부르면 그러면 포드와 백워드가 한 번에 트레이스가 되는 거죠. 그래서 한 번에 트레이스를 하면은 포드와 백워드를 한 번에 만드는 함수를 일단은 만들어놓고 그 함수를 일단 노멀라이제이션을 해요. 여기서는 이걸 트레이라고 불렀는데 그냥 조인트 함수라고 생각하면 될 것 같고 그다음에 그 조인트 함수를 실제 이제 수행을 하면서 트레이스를 하게 되면 그러면 이제 포드와 백워드 부분이 다 합쳐진 하나의 트레이스가 만들어지게 됩니다. 그래서 그렇게 만들어진 거를 이제 저희가 조인트 FX 그래프라고 부르고
Attendees 1 1:02:05 그 그래프를 다시 포워드와 백워드로 이제 분리를 해서 각각 컴파를 해가지고 그거를 네트워치 오트브라 점 펑션이라고 하는 걸로 이제 랩을 해가지고 리턴을 하면 됩니다. 여기서 이제 제가 굉장히 요야했던 부분이 그냥 포드하고 백워드랑 어차피 분리를 해서 따로따로 할 건데 왜 이걸 굳이 다시 조인트를 한 하나의 그런 함수를 만든 다음에 그거를 다시 트레이스를 만들고 그걸 또 다시 이렇게 분리를 하는 어떻게 보면 필요 없어 보이는 이런 과정을 하는 건지라고 하는 게 제가 좀 궁금했었는데 그 이유는 트레이닝을 할 때 메모리를 세이브 하기 위한 그런 뭐라고 그럴까요 그런 테크닉 중에 하나가 리컴퓨테이션이라고 하는 게 있거든요 네 그러니까 리컴퓨테이션이라고 하는 게 뭐냐면은 이제 아까 제가 말씀드린 백 프로포케이션 하는 과정에서 보면은 실제 100프로를 하기 위해서는 각 단계에서
Attendees 1 1:03:00 원래 포드에서 계산됐던 중간 단계에 있는 모든 텐서 값을 다 알고 있어야지 값을 부여할 수가 있잖아요. 근데 그 텐서들이 사실 그렇게 작지 않거든요 그래서 그 애들이 굉장히 큰 텐서들인데 그런 것들을 다 팁을 하게 되면 메모리를 되게 많이 잡아 먹잖아요. 그게 뭐 좋은 건 아니죠. 그래서 그거를 어떻게 밸런스를 하냐면 실제 다시 계산을 하는 게 어떻게 보면 메모리를 더 많이 잡아먹는 유리한 경우들도 있고 이제 그런 경우에는 트레이드오프가 이제 생기게 되니까 예 그걸 그럼 어떻게 해결할까라고 하는 건데 그거를 일단 포드를 베워드랑 분리를 해가지고 하게 되면은 그 밸런스를 맞추는 게 약간 트리키할 수가 있어요. 근데 그거를 일단은 조인트 함수를 다 만들어놔서 어떤 텐서가 다 어디서부터 오는지라고 하는 걸 다 알고 있는 과정에서 그 상태에서 최적화를 하게 되면 훨씬 더 쉽게
Attendees 1 1:03:49 리컴퓨테이션을 구현을 할 수가 있는 것 같아요. 제가 그 모든 한 것들을 다 생각해보진 않았지만은 그게 aot 오토 그래프에서는 약간 보면은 어 도대체 왜 이러는 거지 하는 이런 조인트 함수를 만들어 가지고 트레이싱 한 번에 해서 베드와 포드 계산이 한 번에 표현이 되는 그래프를 만들어내는 이유가 아니었나 그렇게 생각을 합니다. 네 어쨌든 여기서 말한 a부터 i까지의 과정이 오토 a 오토 그래프가 수행되는 단계입니다. 네 여기에서 트레이스를 노멀라이즈 한다는 게 어떤 의미인가요? 라고 하는 거는 이제 아까 제가 이거 모드에서 가지고 있는 여러 가지 복잡성들을 말씀드렸는데 그런 것들을 실제 익스프레스 한 어떤 스텝들로 다 쪼갤 수가 있거든요 명시적으로. 그래서 그런 것들을 다 반영을 해 가지고 다 그런 것들이 이제 트레이스 상에 나타나고 그런 것들을 다시 다 단순한 그런 조그마한 옷들로 다시 쪼개는 그런 과정이 노멀라이제이션이라고 생각을 하시면 됩니다.
Attendees 1 1:04:50 네 그렇게 됐고 그다음에 세미 님께서 탄소를 분해하고 함수함으로써 복잡한 연사를 간략하게 한다는 게 2번의 요지라고 하면 될까요? 해서 2번이 뭐였죠? 이 그래프에서 이번 이었나요 선생님
Attendees 3 1:05:15 펑셔널리제이션 하는 것도 있다. 이번 이제 펑셔널리제이션이 이 제품은
Attendees 1 1:05:20 그래요 그 부분은 이따가 다시 한 번 여기서요
Attendees 1 1:05:32 그렇죠 네 네 네 텐서를 분해 과정이 일어나는지는 잘 모르겠지만 어쨌든 간에 네 인플리스트하게 이거 모드에서 일어나는 여러 가지 그런 복잡한 과정들을 다 명시적으로 드러나게 하고 그런 것들을 다시 이제 간단한 옷들로 쪼개는 과정이 노멀라이제이션이라고 생각을 하시면 됩니다. 다시 이제 돌아오고 이제 이게 이제 실제 a 오터 그래프가 하는 일이고요. 여기에서 질문 들어온 게 aot 오타그라드에서 퍼 백엔드 또는 백워드 어웨어로 최적화할 수 있는 부분이 백워드 컴파일러 단계인 h 외에도 있을까요? 없는 것 같은데요 제 생각에는 네 베어드 컴파일러가 적용되는 부분이 이렇게 포드 베거드가 쪼개진 FX 레프가 만들어진 다음에 이루어지는 과정이어서 저는 그 과정 말고는 없을 것 같다라고 생각을
Attendees 1 1:06:30 h 과정의 컴파일의 의미는 다이나마 부분인가요? 아니요. h 과정에서의 컴파일은 실제 백언디 컴파일러가 진짜 컴파일을 하는 과정입니다. 조인트 함수를 생성한다는 게 어떤 과정인지 다시 한 번 설명해 주실 수 있을까요? 네 이게 어떤 과정이냐면 실제로 저희가 이거 모드에서 백어드 그래프를 만들 때는 이거 모드의 옷 자체를 실제 이제 수행을 하나 하나 하면서 그렇죠 실제로 이제 수행을 하나 하나 하면서 거기에서 하나하나 수행을 할 때마다 이제 백어드 플 포드를 하는 과정에서 인크리멘털하게 백워드에 해당하는 부분들을 이제 텐서에 딱 붙여가지고 만들었거든요. 게 이제 이거 모드에서 aot 그라드가 동작을 하는 방식이고요. aot 오토 그라드에서는 그렇게 하는 게 아니라 그냥 배보드에 해당하는 함수 계산이랑 포드에 해당하는 부분하고 그다음에 백워드에 해당하는 부분을 실제로 그냥 함수를 다 만들어요. 그러니까 a 오토 그라드에 의해서 실제 하나하나 이렇게
Attendees 1 1:07:59 뭐라고 그래 될까요? 백워드 함수가 붙는 과정을 일단 먼저 실행을 한 번 해요. 실행을 한번 실행을 한 번 하면서 이 게 붙여놓으면은 그러면은 실제 백워드에 해당하는 부분들이 다 붙어 있거든요. 근데 그걸 아까 제가 이야기한 백어드 엔진이라고 하는 걸 수행을 하게 되면은 걔네들이 붙어 놓은 거를 그래프 테스크 이런 걸 만들어가지고 쭉 다시 한 번 수행을 한다고 했잖아요 그래서 그 수행하는 부분들도 사실은 어떻게 보면은 하나의 펑션 콜이어서 그 부분까지 그냥 같이 묶어가지고 수행을 하는 함수를 그냥 만들어요. 만든 다음에 걔를 다시 한 포지점 스크립트를 직전 트레이스와 비슷한 그런 트레이싱을 시플트를 쓰면서 다시 한 번 하거든요. 그렇게 되면 그 그래프에는 포드 부분에서 만들어진 텐서들과 그다음에 베어드에서 그걸 사용하는 부분들에 의해서 베어드 계산이 되는 부분에 그런 인풋 아웃풋 관계들이 다 연결이 되어 있는 하나의 그냥 트레이스가 튀어나오겠네
Attendees 1 1:09:03 제가 잘 전달을 했는지 잘 모르겠습니다. 네 그니까 목적 자체는 포드에서 계산을 한 거랑 백오드에서 계산한 걸 그냥 하나하나 순차적으로 수행을 해서 결과적으로 그래드 값을 얻어내는 게 목적이 아니라 백어드와 포드를 한꺼번에 합쳐서 포드에서 만들어진 텐서의 인풋들이 서 텐서가 백어드 부분의 인풋으로 연결이 되는 부분들까지 다 살아 있는 하나의 계산 그래프를 만들고 싶은 게 목적이어서 그걸 어떻게 해 내냐면 포드를 한번 쭉 이제 흩으면서 이제 포드가 맨 처음에 한 번 훑어내면서 그레드 펑션들은 다 등록이 되어 있는데 그 등록되어 있는 그래드 펑션들을 오토 그라드 엔진이 수행을 하면 그럼 실제로 그 함수들이 디스패치가 되잖아요. 그러니까 그 부분이랑 다시 한 번 포드를 했을 때 계산하는 부분이 연결되도록 만들어가지고 그거를 쭉 디스패치를 하게 되면 그러면 마치 포드로 그냥 한 번 그냥 트레스를 뽑아내는 것처럼 모든 텐서들이 다 연결되어 있는 트레스가 한 번에 튀어나오는 색인 거죠.
Attendees 3 1:10:10 그러면 센터 나 파티션 할 때 그냥 슬라이싱 하는 방식으로 어쩔 거요?
Attendees 1 1:10:13 그거는 파티션에 가는 알고리즘이 따로 있는 것 같아요. 뭐 뭐 민컷 뭐 이런 알고리즘을 쓴다고 돼 있는데 네 그런 알고리즘 디테일은 제가 보지는 않았습니다. 제가 이것보다 더 자세히 설명을 드리기는 잘 설명드리기는 쉽지는 않은 것 같습니다. 네 아무튼 이 정도까지 하고 그러면 넘어가도록 하겠습니다. 그래서 실제 이제 이거를 코드 레벨로 봤을 때 시풀풀 코드에서 봤을 때 시플풀 코드도 있고 파이썬 코드도 있는데 아무튼 코드 봤을 때 일어나는 일들을 다시 한 번 쭉 이제 매핑을 해 본 거예요. 그러니까 실제 그 반티가 말씀드린 이런 부분들의 가장 탑 레벨 펑션이 a 디스패치 오트그라드라고 하는 함수가 있고요. 이거를 일단은 aot 디스패치 오토브라드 그래프라고 하는 함수를 불러서 그거를 시다. 네 그걸 가지고 조인트 FX 그래프를 만들어내는 과정이 맨 첫 번째 있는 큰 블랙 포인트이고
Attendees 1 1:11:11 그게 얻어지면 이 그래프 상에 이 그림상 이 슬라이드 상에서 주라고 하는 부분으로 가서 파티셔닝이 일어나고 그래서 포드 부분과 백워드 부분을 나눠서 각각 컴판을 한 다음에 그거를 제가 몇 번 반복해서 말씀드렸던 토치 점 오라 점 펑션을 새로 만들어가지고 랩을 해서 이제 리턴을 하면 되는 게 이제 탑 레벨에서 일어나는 일인데 여기에서 이제 가장 복잡한 부분은 실제로 그러면 그 조인트 그래프를 만들어내는 과정이고 피를 그래프를 만들어내는 과정은 네 여기 나와 있듯이 먼저 양쪽에 해당하는 함수 그니까 포드 부분과 백오드 부분에 해당하는 함수를 붙여가지고 그게 마치 그냥 포드로만 시행을 해도 포드와 백오드가 계산이 되는 함수로 만들어내는 과정이 이제 빈 셈이고요. 그렇게 만들어낸 함수 자체를 일단 노멀라이제를 한 다음에 이 거기서 크리트 그래프라고 하는 게 실제로 트레이싱이 일어나는 과정이 되고요.
Attendees 1 1:12:06 네 이제 실제 트레이싱을 해서 그걸 가지고 이제 FX 그래프를 만들고 그거를 디콘 포지션을 해가지고 다시 한 번 쪼갠 다음에 더 이제 더 낮은 수준의 옷들로 만들고 그다음에 이제 x스 래프를 생성하게 됩니다. 이 노멀라이즈는 이거 모드의 복잡한 것들을 해결하는 그런 과정이고 이에 있는 디컨포지션이라고 하는 거는 제가 그래프 모드 설명할 토치 아이알이 있고 atn이라고 하는 데가 있고 코어 atn이었나요? 이라고 하는 게 있고 그게 이제 크림 메이으로 이제 쪼개지는 그런 과정을 설명했는데 이제 그게 이제 디컴포지션 과정이거든요 이거는 이거 머리의 그런 복잡성이라기보다는 굉장히 많은 토치 옷들을 이제 정해진 몇 개의 적은 숫자의 토치 옷들로 표현을 하기 위한 그런 포지션 가동이 일어나면서 최종 FX 그래프가 만들어지고 이런 조인트 FX 그래프를 다시 쪼개가지고 각각 컴파일을 해서 웹을 해가지고 리턴을 하게 됩니다.
Attendees 1 1:13:01 어떻게 보면 제가 거의 똑같은 이야기를 다른 형태로 계속해서 반복해서 설명을 하고 있는 이게 이제 이 제가 이걸 왜 이걸 다시 한 번 실제 예제를 가지고 다시 한 번 설명을 그러면 드릴 텐데 맨 처음에 제가 보여드렸던 예제랑 거의 같은 거고요. 여기서는 이제 데코레이터를 써서 이제 컴파일 하도록 만들어 놓은 거고 여기에서 이제 펑크라고 하는 애를 부르게 되면 실질적으로는 컴파일 되어 있는 펑션을 불러주고 이제 로스 계산한 다음에 이제 그레이드를 구하는 제가 맨 처음에 드렸던 예시랑 거의 똑같은 예시라고 생각을 하면 되고 아까 이제 제가 말씀드렸던 것처럼 조인트 그래프를 만드는데 그 조인트 그래프를 만들기 전에 실제 파이턴 수준에서 봤을 때 그런 조인트 함수라고 하는 거를 만들게 되고요. 실제 포드에 해당하는 게 여기는 f 그래서 인풋이 들어오면은 out풋을 리턴을 한다라고 하면 이게 조인트로는 어떻게 표현을 하냐면 에 해당하는 부분에
Attendees 1 1:14:03 0엔드에 해당하는 함수를 실제로 익스포스트하게 만든 다음에 그거를 이제 붙여가지고 돌리게 되면 그러면 이제 실제 포드와 백워드를 백어드가 포드로 대상 것처럼 보이는 그런 하나의 함수를 만들어낼 수가 있는 거죠. 여기서 이제 인풋 자체는 실제 포드로 들어오는 인풋들 그다음에 백워드가 시작될 때 최종 결과물들이 로스를 통해서 들어오는 그 아웃 그래드 아웃 이 두 개가 조인트 그래프의 인풋이 되는 거고요. 왜냐하면은 다시 한 번 말씀드리면은 포드는 원래 저희가 생각하는 모델의 인풋이 들어오는 거고요. 그다음에 백워드를 할 때에는 두 가지가 있는데 하나는 로스로부터 들어오는 그 최종 단에서의 그레드 값이 리프으로 들어와야 되고 그다음에 4드 가정에서 계산된 중간 단계 텐서 값들이 같이 들어와야 저희가 1005드 계산을 할 수가 있는데 그 중간 단계의 텐서들은 포드 그래프 안에 이미 포함이 돼 있으니까 저희가 조인지 그래프의 인풋으로 생각을 할 필요가 없고
Attendees 1 1:15:08 하지만 지금 저희가 있는 시뮬레이션 상에서는 로스 펑션은 지금 FX 그래프 안에 캡처가 된 게 아니라 바깥에 있는 부분이니까 로스로부터 들어오는 그레드 값은 이 조인트 포드 벨로드 그 인스 들어와야지만이 저희가 최종 아웃 그래디언트를 다 계산을 할 수가 있게 되는 거죠. 그 그 과정을 이제 실제로 익스프리스트하게 만들어 놓은 펑션이 조인트 FX bw라고 하는 함수이고 이 함수를 오토 그라드를 키지 않고 그냥 쭉 트레이싱을 하게 되면 그럼 저희가 조인트 그래프를 만들게 되죠.
Attendees 1 1:15:43 이제 이게 그냥 네 조인트 글래프의 익플이라고 생각하시면 되고 이제 이 과정에는 실제 포드라고 되어 있죠 왜냐하면 실제로는 보드인 셈인 거죠. 네 근데 이 포드 안에 원래 이제 포드와 백오드가 다 들어 있고 이거를 민컷이든 그런 알고리즘을 써가지고 이제 파티션을 하게 되면은 그거는 이제 두 개로 쪼개지게 되고 디코프지는 아까 제가 다 잠깐 설명을 드렸으니까 넘어가도록 하겠습니다. 네 아까 제가 말씀드렸던 리컴퓨테이션이 이런 액티베이션 티포인팅이라고 하는 이런 기술이라고 하네요. 제가 트레이딩 전문가는 아니어서 사실 이런 용어들은 저를 친숙하지 않습니다. 네 그래서 이제 최종 결과물이 이런 포드와 백워드가 다 붙어 있는 토치 오토브라이드 펑션이라고 하는 거고요. 이거는 파이토치 2 0에서 토 aot 오토그라드를 만들기 위해서 새로 만들어진 게 아니라 원래 파이토치 1 0에서부터 아까 말씀드린 것처럼 커스텀 오플에 대한
Attendees 1 1:16:41 미분 함수를 커스텀으로 만들어서 붙이기 위해서 원래 만들었던 개념인데 제가 잠깐 그 하이레벨로 어떤 일이 일어나나를 설명을 드렸을 때 FX 그래프에 의해서 이렇게 딱 캡처가 된 그 부분을 오 하나 포스터 옵이라고 생각을 하면 자연스럽게 연결이 되는 셈인 거죠. 커스터 에x 그래프로 표현이 되는 커스텀 무에 그런 커스텀 미분 함수가 필요한데 그거를 사람이 작성하려고 하면 당연히 못하죠. 그래서 그거를 자동으로 만들어 가지고 이렇게 이제 만들어주는 게 a 오토그라드라고 하는 거고 그거 안에서 일어나는 복잡한 과정들을 오늘 제가 여러 각도에서 여러 번 설명을 드렸던 것 같습니다. 네 그래서 이거는 또 똑같은 이야기니까 다시 한 번 나중에 한번 보시면 될 것 같습니다. 네 이게 마지막 슬라이드네요.
Attendees 1 1:17:35 이렇게 해서 제가 준비한 건 다 설명을 드렸고 남아 있는 질문들을 그럼 조금 더 해보면 b 과정에서 아웃과 백워드 아웃은 어떤 의미인지 설명해 주실 수 있나요? 이게 몇 번 슬라이드에서 한 질문일까요?
Attendees 1 1:18:02 제가 잘 모르겠는데 여기 이거요 아니 여기요
Attendees 1 1:18:17 그러니까 아웃은 실제 포드로 함수를 수행했을 때 나오는 아웃풋이고요. 그러니까 저희가 일반적으로 밀어내도 그냥 인풋이 들어오면 나가는 아웃풋이라고 생각하면 되고 이 005대 아웃풋은 웨이트들의 그래디언트 같이겠죠. 설명이 됐나요? 네 이전장에서 be 과정은 조인트 그래프를 만드는 부분인데 여기에서는 분리가 돼 있는 것 같아서요. 그러니까 여기서의 이비라고 하는 부분이 b라고 하는 부분이 조인트 그래프를 만들기 전에 그걸 실제 트레이스를 트레이스에 인풋이 되는 함수를 포드와 백오드 부분을 합쳐가지고 만든 거고 합쳐진 함수의 아웃풋은 네 뭐 이렇게 되는 셈이고 그다음에 인풋은 네 인풋은 아까 말씀드린 것처럼 들어오는 인풋하고 그다음에 로스로부터 들어오는 것들이 이제 인풋이 되겠죠. 알겠습니다. 얼마나 설명이 잘 되는지 모르겠지만 그렇게 해서 오늘 일단 제가 준비한 내용은 다 됐고 혹시 뭐 추가로 질문 있는 거 있으면은 몇 개 더 받고 오늘 마무리하면 될 것 같습니다.
Attendees 1 1:19:49 29페이지가 어디죠?
Attendees 1 1:19:58 이거요 네네네.
Attendees 2 1:20:10 지 또 하나의 들어가잖아요. 이게 뭔지 잘 모르겠어요.
Attendees 1 1:20:18 이게 두 번째 칸에서 두 번째 레이어에서 말씀하시는 거예요. 그러면 제가 한번 그래프를 그려보면 이 부분 말씀을 하시는 거예요 이거 네네 네 이거를 제가 그럼 한번 이렇게 한번 시도를 해볼게요.
Attendees 1 1:20:49 응 이 슬라이드로 보면 이게 사실 조윤지 그래프거든요 여기에 이걸 다 합친 게 조인트 그래프예요.
Attendees 1 1:21:08 이게 다 조인트 그래프고 여기서 인 아웃은 좀 헷갈리긴 한데 이 그래프를 생각해 보면 여기에서 이 로스 펑션으로부터 들어오는 그 백워드 그래프를 트리거 하는 시작점들이 있잖아요. 이거는 지금 저희가 조인트 그래프를 만들 때는 바깥으로 빠져나가 있거든요. 그래서 이 부분이 하나가 필요한 거고요. 그다음에 실제 포드가 시작이 되려면 원래 인풋이 들어와야 되잖아요. 그래서 이게 안으로 들어와야 되는 거죠. 그래서 만들어지는 값은 요 값도 있고 아웃풋이 나가는 거 이게 있어야지 로스 펑션을 구할 수 있으니까 튀어나가야 되는 거고 그다음에 이렇게 튀어나오는 트가 그러니까 옵티마이저로 들어가서 업데이트가 돼야 되는 웨이트 값을 만들어주는 부분이 되는 거죠. 또 다시 한 이 두 개를 합쳐서 저희가 조인트 펑션이라고 정의를 하는 건데 내지는 조인트 그래프 인풋은 원래 모델의 인풋이 있는 거고 그다음에
Attendees 1 1:22:15 블랙박스로 빼놓은 노스 펑션으로부터 들어오는 그래디언트 베거디를 트레걸 하는 부분이 인풋으로 또 있는 거고 아웃풋은 원래 모델의 아웃풋이 있는 거고 다음 번 이터레이션에서 고정돼야 될 이트들을 위한 값이 튀어나오는 그게 다시 돌아가서
Attendees 1 1:22:43 이걸로 보면 이게 결국 이게 원래 인풋이고요. 그다음에 요게 여기서 아웃이라고 돼 있는데 이제 그래디언트를 통해서 이제 베거드를 시작하기 위해서 들어오는 인풋 값이 되는 거고 요게 원래 모델이 아웃 값이 되는 거고 그다음에 여기서 그레이드 인풋이라고 되어 있는 부분이 이제 다음 번 인터레이션에 보정을 하기 위해서 튀어나오는 그랜드 값이 네 그러면 되나요? 네 알겠습니다. 또 질문 있습니까? 네 결국에 모델은 컴파일하면은
Attendees 4 1:23:24 모델의 포워드랑 모델의 백어드는 만들어지고 그거를 컨베이하는 건데 아까도 말씀하셨지만 로스 펑션을 계산을 하고 그 값의 레디언트를 넣는 부분은 가 생각했을 때 학습을 한다고 했을 때 네 결국에는 트레이스를 그려보면은 로스까지 계산을 하고 백어드 이렇게 계산을 하고 다시 옵티마이즈 하면 다시 보드로 돌아오는 이런 거를 판번 앱트
Attendees 1 1:23:53 저는 되게 좋은 질문인 것 같아요. 되게 좋은 질문이고요. 그렇게 되면 몇 가지 복잡한 일들이 생기는데 하나는 제가 이제 이 슬라이드를 설명을 드렸잖아요. 그럼 여기에서 이렇게 배어 있는 원래 있는 이거 모드에 있는 거를 이렇게 오른쪽에 있는 것처럼 바꾸는 게 아니라 바꾸는 게 아니라 사실은 이 전체를 저희가 하나의 함수로 정리를 한 다음에 그거를 컴파인을 해야 돼요. 그렇죠 그렇게 하면은 방금 말씀하신 그런 의도대로 될 텐데 근데 현실적으로는 그렇게 하게 되면은 그 안에서는 요런 애들이 이런 이제 루스를 구하는 이런 애들이 사실 그 그래프 베이크를 만들어낼 확률이 커서 예측 불가능하게 어쨌든 간에 그래프 베이크는 일어나게 될 것 같아요. 그게 하나고요. 그다음에 두 번째는 그런 거를 해결을 하기 위해서 뭔가 지금 파이토치 하시는 분들이 새롭게 시도하시는 노토브라드가 또 하나가 있거든요 저 aot 컴파일드 어쩌고 저쩌고 하는 이런 게 있어요. 그래서 그것도 내용에 포함할까 하다가
Attendees 1 1:25:17 네 양도 많기도 하고 완성된 기능도 아니고 해서 빼기는 했는데 이제 좀 더 로버스트하게 이걸 하나로 합쳤을 때에도 트레이스를 잘 뽑아낼 수 있도록 해주는 무언가를 지금 만들고 있기는 해요 그럼 그게 만들어지면 뭔가 크게 바뀔까? 저는 잘은 모르겠어요. 왜냐하면 로스 계산이라고 하는 게 실제로 막 이렇게 막 오래 걸리는 그런 일이 아니라 상대적으로 전체 트레이닝에서 차지하는 부분들은 얼마 안 될 수도 있어서 이 그래프 브레이크가 실제 있어서 그냥 포드 백워드 계산을 한다 해도 뭐 그렇게 나쁘지는 않지 않을까 싶긴 하거든요. 그래서 이렇게 다 합쳐서 하나를 트레이스를 만들어서 얼마만큼 더 최적화가 될 것이냐라고 하는 것들에 대해서는 저는 뭐 그럴 수도 있긴 하지만 그렇지 않을 그런 개연성도 저는 높은 것 같긴 해요. 근데 어쨌든 간에 저는 되게 좋은 질문인 것 같아요. 습니다. 또 질문 있으십니까? 하나만 더 바꾸는 끝날게요. 시간이 오래 돼서
Attendees 5 1:26:17 과정에서 이제 이거 모드를 이제 그래프로 하는 과정으로 진행하면서 그렇게 되면 다이나믹 컴파일을 하는 건지 그 위에 있는 이 페그 텐스를 통해서 실제로 하늘로 동작할 코스까지 다 생성을 해내는 건지
Attendees 1 1:26:38 질문 다시 한 번 해줄 수 있어요? 제가 정확하게 잘 이해를 못했어요.
Attendees 5 1:26:42 실점 컴파를 하는 과정에서 크 텐서를 넣어서 실제 연설을 하지 않고 네 이제 에스 그래프만 만들어내는 과정으로 제가 이해를 했었는데요. 네 그렇게 된다면은 실제 하드웨어에서 동작할 코드를 그런 것까지 만드는 것이 아니라 이제 그래프 레벨에 통로 최적화를 수행하는 거니까
Attendees 1 1:27:03 아니죠 그러니까 다이나모의 백엔드로 뭐를 붙이냐에 따라 다른데 다이나모의 백엔드로 실제로 어떤 하드웨어의 특성에 맞게 컴파일을 백엔드 컴파일을 붙여가지고 넣게 되면 아까 말씀하신 그런 다이나마에 의해서 캡처된 ff가 다시 그 백엔드 컴파일러 인풋으로 들어가서 실제 하도에서 돌아갈 코드가 만들어져요. 네 그리고 그런 것들이 이제 NN 모듈로 다 감싸져서 그냥 그 모듈을 돌리면 실제 안에 까보면은 이제 하드웨어로 디스패치가 돼가지고 실제 돌아가는 모든 과정들이 그 안에서 다 표현이 되게 되죠. 습니까? 오늘 되게 복잡한 내용 들었는데 이렇게 끝까지 들어주셔서 감사하고요. 추가 질문이나 이런 것들은 제 생각에는 일단 여기 슬라이드에 남겨주시거나 아니면 기타브 이슈로 남겨주시면은 대응을 하도록 하겠습니다. 네 감사합니다.