걸음으로 견준 것이 트랜스포머에 유리했다
7편은 다섯 구조를 같은 걸음 수로 견줬다. 그 편 끝에 이렇게 적어 두었다 - 걸음당 값이 다르면 그 비교가 공정한지부터 따져야 한다고.
갚는다.
걸음 하나에 얼마나 걸리나
배치 32 로 학습 걸음 하나 - 순전파, 역전파, 클리핑 - 를 재고, 문맥을 16에서 128까지 바꾼다. 라운드로빈으로 다섯을 한 라운드에 한 번씩 돌린다.
문맥 16 32 64 128 128/16
CNN 17.6 25.2 36.3 73.8 4.2
LSTM 14.9 24.9 48.1 81.2 5.4
RNN 15.0 25.2 39.7 88.4 5.9
트랜스포머 16.6 27.9 47.1 99.1 6.0
GRU 18.2 31.9 55.9 119.8 6.6
재귀가 안 느리다
문맥 128 에서 트랜스포머를 1 로 놓으면 CNN 0.74, LSTM 0.82, RNN 0.89,
GRU 1.21 이다.
재귀 둘이 트랜스포머보다 빠르다. 예상과 반대다. 재귀는 문맥을 순서대로 128번 지나야 하고 트랜스포머는 자리들을 한꺼번에 계산하니, 재귀 쪽이 느려야 맞다.
문맥이 8배 늘 때 늘어나는 배수도 4.2에서 6.6 사이에 다 있다. 어텐션은
T² 이고 재귀는 T 인데 트랜스포머 6.0, RNN 5.9 로 구분이 안 된다.
순차성의 값은 융합 커널이 숨긴다
nn.LSTM 이 순차 루프를 파이썬이 아니라 C 에서 돌리기 때문이다. 2편에서 게이트를
꺼내려고 같은 계산을 파이썬 루프로 써 두었으니, 그 둘을 같은 라운드에서 나눠
보면 값이 보인다.
문맥 파이썬 루프(ms) nn.LSTM(ms) 배
16 4.9 3.4 1.61
32 13.8 5.6 2.44
64 24.5 11.5 2.15
128 48.3 22.1 2.12
문맥을 16에서 128로 8배 늘리면 파이썬 루프는 9.8 배, 융합 커널은 6.4 배다.
파이썬 루프는 걸음 수에 거의 비례하고, 융합 커널은 그러지 않는다. 순차성의
값은 실재하는데 커널이 절반쯤 흡수한다.
그리고 이 크기에서는 흡수하고 남은 값도 어텐션의 T² 과 구분이 안 될 만큼
작다. 시리즈2 에서 걸음 하나의 절반이 고정 오버헤드였던 것과 같은 얘기다.
비싼 것은 걸음 수다
걸음당 값이 비슷하면, 시간을 가르는 것은 몇 걸음이 필요하냐다. 7편에서 각자 바닥을 찍은 걸음 수에 걸음당 시간을 곱하면
걸음 걸음당(ms) 합(초) 최소 검증
CNN 300 73.8 22.1 1.8709
LSTM 800 81.2 65.0 1.6776
RNN 800 88.4 70.7 1.8355
GRU 800 119.8 95.8 1.6449
트랜스포머 2750 99.1 272.5 1.7679
트랜스포머가 자기 바닥에 닿는 데 272.5초, CNN 의 12.3 배, GRU 의 2.84
배가 든다. 걸음이 비싸서가 아니다. 2750 걸음이 필요해서다.
그래서 걸음으로 견준 것은 공정했나
공정했고, 오히려 트랜스포머에 유리했다.
7편은 다섯에게 같은 4000 걸음을 주고 각자의 최저점을 봤다. 시간으로 바꾸면 트랜스포머만 남들의 서너 배를 쓴다. 초로 예산을 잡았다면 트랜스포머는 자기 바닥에 닿기도 전에 끊겼을 것이다.
GRU 는 95.8초 에 1.6449 에 닿고 트랜스포머는 272.5초 를 써서 1.7679 에
닿는다. 7편의 순위가 시간으로 견줘도 그대로이고, 간격이 벌어진다.
7편의 한 문장을 고친다
7편은 “GRU 한 번 돌리는 데 트랜스포머보다 두 배 넘게 걸렸다” 고 적었다. 그
숫자는 다섯 설정을 연달아 돌리며 잰 것이라 믿을 게 못 된다. 라운드로빈으로
다시 재면 걸음당 1.21 배다.
시리즈2 10편에서 절대 시간을 연달아 재면 안 된다는 것을 이미 겪었는데, 7편을 쓸 때 그 교훈을 자기 자료에 안 적용했다. 고쳐 두었다.
남는 것
CPU 이야기다. GPU 에서는 어텐션이 훨씬 잘 병렬화되고 재귀의 순차 루프가 그대로 남으므로 순서가 뒤집힐 것이다 - 이 노트북에는 없다.
문맥도 128까지만 봤다. T² 은 길어질수록 아프고 재귀의 T 는 안 그러니,
1024쯤 가면 표가 달라질 것이다. 위치 임베딩이 128자라 여기서 못 늘린다.
그리고 걸음 수는 7편에서 잰 것을 그대로 썼다. 학습률을 구조마다 맞추면 필요한
걸음 수가 달라지고, 그러면 이 표도 달라진다. 다섯에게 같은 3e-4 를 준
것이 트랜스포머에 불리했을 수 있다.
그래서
- 걸음당 시간이 문맥 128에서 CNN
0.74, LSTM0.82, RNN0.89, GRU1.21배다 (트랜스포머 = 1). 재귀가 안 느리다 - 문맥 8배에 늘어나는 배수도
4.2~6.6로 다 몰려 있다. 어텐션의T²이 재귀의T와 구분이 안 된다 - 순차성의 값은 실재한다. 같은 LSTM 계산을 파이썬 루프로 쓰면
2.12배이고 문맥 8배에9.8배 (융합 커널은6.4배) 늘어난다 - 트랜스포머를 비싸게 만드는 것은 걸음당 값이 아니라 걸음 수다.
2750대800 - 자기 바닥까지 CNN
22초, GRU96초, 트랜스포머273초. 트랜스포머가 GRU 의2.84배를 써서 더 나쁜 손실에 닿는다 - 걸음으로 견준 7편은 공정했고, 트랜스포머에 유리한 쪽이었다
- 7편의 “두 배 넘게” 는 연달아 잰 값이라 틀렸다. 고쳤다
Comments