배치
고친 사람 github-actions[bot]
배치는 입력 여러 개를 한 덩이로 묶어 모델이 한 번에 계산하게 합니다. 하나씩 계산할 때보다 같은 시간에 더 많은 입력을 처리합니다. 머신러닝에서는 모델을 훈련할 때도 서비스에서 답을 낼 때도 이 묶음을 씁니다. 일을 모아 정해진 때에 한꺼번에 돌리는 방식 전반은 배치 처리라는 이름으로 따로 다룹니다.
쉽고 빠른 이해
무슨 일을 하는 물건인가 — 모델에 넣을 입력을 여러 개 묶어 한 번에 계산하게 합니다. 사진 한 장씩 서른두 번 계산하는 대신 서른두 장을 한 묶음으로 넣어 한 번에 계산하는 것이 배치입니다.
왜 이렇게 하나 — 계산 장비는 곱셈을 동시에 아주 많이 할 수 있습니다. 입력을 하나만 넣으면 장비 안의 계산 장치 대부분이 놉니다. 여럿을 묶어 넣으면 놀던 부분까지 일을 합니다.
어떻게 도나
- 입력을 정해 둔 개수만큼 모읍니다
- 모은 입력을 한 덩이로 쌓아 모델에 넣습니다
- 모델이 묶음 전체를 한 번에 계산해 답을 묶음째 돌려줍니다
대가 — 묶음이 클수록 메모리를 많이 씁니다. 서비스에서는 먼저 온 요청이 묶음이 찰 때까지 기다립니다.
상세
이 절은 배치가 무엇을 아끼는지, 훈련과 추론에서 어떻게 쓰이는지, 크기를 어떻게 정하는지를 차례로 봅니다. 끝에는 묶지 않는 때와 같은 이름의 다른 뜻을 짚습니다.
버스와 승객
승객 한 명이 정류장에 올 때마다 버스를 출발시키는 회사는 없습니다. 정류장에서 여럿을 태워 같이 갑니다. 버스 한 대를 한 번 운행하는 비용은 승객이 한 명이든 마흔 명이든 크게 다르지 않습니다.
묶으면 빨라지는 까닭
머신러닝의 모델은 입력을 받아 답을 내는 계산식입니다. 식 안에는 곱하고 더할 숫자가 아주 많이 들어 있습니다. 이 숫자들을 파라미터라고 부릅니다. 모델의 계산은 대부분 입력과 파라미터를 곱하고 더하는 일입니다.
이 곱셈들은 서로의 결과를 기다리지 않습니다. 그래서 곱셈을 동시에 아주 많이 하는 장비에서 빨리 끝납니다. 그런 장비가 GPU(Graphics Processing Unit, 그래픽 처리 장치)입니다.
GPU 한 대 안에는 곱셈을 맡는 계산 장치가 아주 많이 들어 있습니다. 파라미터를 담아 두는 메모리도 GPU 에 따로 붙어 있습니다. 입력 하나만 넣으면 계산 장치 가운데 일부만 일합니다.
입력을 여럿 묶으면 두 가지를 아낍니다. 하나는 놀던 계산 장치입니다. 묶음 안의 입력들을 동시에 계산하니 계산 장치가 쉬지 않습니다.
다른 하나는 파라미터를 읽어 오는 일입니다. 곱셈을 하려면 파라미터를 메모리에서 계산 장치로 가져와야 합니다. 이 가져오는 일은 곱셈 자체보다 훨씬 오래 걸립니다.
입력 하나마다 가져오면 같은 파라미터를 입력 수만큼 다시 읽습니다. 묶음으로 계산하면 한 번 가져온 파라미터를 묶음 안의 모든 입력에 씁니다.
묶음이 만드는 모양
배치는 입력을 늘어놓은 목록이 아니라 숫자 배열 하나입니다. 손글씨 숫자 사진 한 장을 숫자 784개짜리 한 줄로 펼친 것을 입력 하나로 생각해 봅니다. 이런 사진 32장을 묶은 배치는 32줄짜리 표가 됩니다.
배열에서 숫자가 늘어선 방향 하나를 축이라고 합니다. 줄 하나는 축이 하나입니다. 표는 가로와 세로로 축이 둘입니다.
32장을 세로로 쌓으면서 새로 생긴 축이 배치 차원입니다. 흔히 맨 앞 축으로 둡니다.
아래 코드에서 x 는 사진 한 장입니다. xs 는 32장을 묶은 배치입니다. W 는 784개를 받아 숫자 0~9 각각의 점수 10개를 내는 파라미터입니다.
@ 는 파이썬의 행렬 곱셈 연산자입니다. .shape 는 배열이 축마다 숫자를 몇 개씩 가졌는지 보여 줍니다.
x.shape # (784,)
xs.shape # (32, 784)
W.shape # (784, 10)
(x @ W).shape # (10,)
(xs @ W).shape # (32, 10)
사진 한 장 x 를 넣으면 점수 10개가 나옵니다. 32장을 묶은 xs 를 넣으면 같은 W 로 곱셈 한 번에 32장의 점수가 모두 나옵니다. 모델 쪽 식은 바뀌지 않았습니다. 앞에 붙은 배치 차원만 결과까지 따라왔습니다.
훈련에서의 배치
훈련은 모델의 파라미터를 찾는 과정입니다. 정답이 붙은 예시를 모델에 넣습니다. 그리고 모델의 답이 정답에서 얼마나 먼지 잽니다. 이 거리를 손실이라고 부릅니다. 손실이 줄어드는 쪽으로 파라미터를 조금 고치는 일을 수없이 되풀이합니다.
한 번 고칠 때 예시를 몇 개 볼지가 문제가 됩니다. 예시 하나만 보고 고치면 그 예시 하나에 휘둘려 방향이 흔들립니다. 데이터 전체를 보고 고치면 방향은 고르지만 한 번 고치는 데 오래 걸립니다. 데이터 전체가 메모리에 안 들어가기도 합니다.
가운데 길은 데이터를 작은 묶음으로 나눠 묶음 하나마다 한 번 고치는 것입니다. 이 묶음이 미니배치입니다. 실무에서는 줄여서 배치라고 부르는 일이 많습니다.
배치는 하나씩 차례로 들어갑니다. 배치 1 로 파라미터를 고치면 배치 2 는 고친 파라미터로 계산합니다.
배치를 한 번씩 다 쓰면 데이터 전체를 한 바퀴 돈 것입니다. 이 한 바퀴가 에포크입니다. 아래 그림은 예시 1,000개를 100개씩 나눈 경우입니다.
flowchart TD
D["훈련 데이터 · 예시 1,000개를 100개씩 나눈다"] --> B1["배치 1 을 계산한다"]
B1 --> U1["파라미터를 고친다 · 1번째"]
U1 --> B2["고친 파라미터로 배치 2 를 계산한다"]
B2 --> U2["파라미터를 고친다 · 2번째"]
U2 --> BR["배치 3~10 도 차례로 계산하고 고친다"]
BR --> E["에포크 하나가 끝난다"]
그림에서 에포크 하나 동안 파라미터를 고친 횟수는 배치 수와 같은 10번입니다. 훈련은 보통 에포크를 여러 번 돕니다.
추론에서의 배치
추론은 훈련을 마친 모델에 새 입력을 넣어 답을 받는 일입니다. 서비스에 올라간 모델은 요청이 올 때마다 추론을 합니다. 요청은 한 건씩 따로 들어옵니다.
서버는 들어온 요청을 바로 계산하지 않고 잠깐 모을 수 있습니다. 몇 건이 모이면 한 배치로 묶어 모델에 넣습니다. 답이 나오면 각 요청에 제 몫을 나눠 돌려줍니다.
sequenceDiagram
participant 사용자들
participant 서버
participant 모델
사용자들->>서버: 요청 A
사용자들->>서버: 요청 B
사용자들->>서버: 요청 C
Note over 서버: 정한 개수가 차거나 정한 시간이 지날 때까지 모은다
서버->>모델: A · B · C 를 한 배치로 넘긴다
모델-->>서버: 답 세 개
서버-->>사용자들: 각 요청에 제 답을 돌려준다
그림의 모으는 단계가 대가를 만듭니다. 요청 A 는 B 와 C 가 올 때까지 계산을 시작하지 못합니다. 그래서 기다리는 시간에 상한을 둡니다. 그 시간이 지나면 덜 찼어도 출발시킵니다.
들어오는 요청을 이렇게 그때그때 묶는 방식이 동적 배칭입니다. 막 들어온 요청 몇 건을 길어야 상한만큼만 모읍니다.
이름이 비슷한 배치 추론은 다른 일입니다. 밤마다 전체 회원의 추천 목록을 미리 만들어 두는 작업이 그 예입니다. 요청을 기다리지 않고 하루치를 몰아 돌립니다.
배치 크기를 정할 때 저울질하는 것
한 배치에 담는 입력의 개수를 배치 크기라고 부릅니다. 훈련에서도 추론에서도 사람이 정하는 값입니다. 크기를 바꾸면 여러 값이 함께 움직입니다.
먼저 알아 둘 두 낱말이 있습니다. 처리량은 정해진 시간 동안 끝낸 입력의 개수입니다. 지연은 요청 한 건이 들어와서 답이 나가기까지 걸린 시간입니다.
| 배치를 키우면 | 배치를 줄이면 | |
|---|---|---|
| 한 번 계산에 드는 메모리 | 늘어난다 | 줄어든다 |
| 처리량 | 대개 는다 | 대개 준다 |
| 서비스에서 한 요청의 지연 | 길어진다 | 짧아진다 |
| 훈련에서 에포크 하나 동안 고치는 횟수 | 준다 | 는다 |
표의 첫 줄이 위쪽 한계를 정합니다. 모델은 계산을 여러 단계로 나눠 합니다. 한 단계가 낸 결과는 다음 단계가 받아 쓸 때까지 메모리에 남습니다. 이 결과가 계산 중간값입니다.
중간값은 입력마다 따로 생깁니다. 그래서 배치가 커지면 배치 자체와 함께 중간값도 늘어납니다. 이 둘이 GPU 메모리에 모두 들어가야 합니다. 넘치면 메모리가 모자란다는 오류로 계산이 멈춥니다.
처리량은 끝없이 늘지 않습니다. 계산 장치가 놀지 않을 만큼 배치가 차면 더 키워도 처리량이 거의 안 늘어납니다. 그 뒤로는 메모리와 지연만 늘어납니다.
묶지 않는 때
요청이 드물게 들어오는 서비스에서는 묶을 상대가 없습니다. 묶음을 기다리는 시간만 늘어납니다. 처리량은 늘지 않습니다. 한 건 한 건의 응답 시간이 가장 중요한 서비스도 기다림을 감당하기 어렵습니다.
입력의 길이가 제각각이면 묶는 비용이 늘어납니다. 문장을 낱말 단위로 넣는 모델이라면 세 낱말짜리 문장과 스무 낱말짜리 문장이 한 배치에 섞입니다. 배치는 줄마다 길이가 같은 표 모양의 배열이어야 합니다.
짧은 입력 뒤에는 빈 값을 덧대 긴 입력에 맞춥니다. 이렇게 빈 값을 덧대는 일을 패딩이라고 부릅니다. 길이 차이가 클수록 의미 없는 값을 계산하는 몫이 커집니다.
같은 이름의 다른 뜻
배치 처리는 일을 모아 두었다가 한꺼번에 처리하는 방식 전반을 가리킵니다. 밤마다 하루치 주문을 몰아 정산하는 배치 작업이 대표적입니다. 모아서 한 번에 돌린다는 뼈대는 이 항목의 배치와 같습니다.
우리말 「배치」에는 물건을 어디에 놓을지 정한다는 뜻도 있습니다. 화면에 요소를 늘어놓는 일이 그렇습니다. 이 뜻은 영어 batch 와 상관없는 낱말입니다. 이쪽은 레이아웃이 다룹니다.
관련 항목
배치를 나누고 세는 단위
미니배치 · 배치 크기 · 에포크 · 이터레이션 · 배치 차원
배치 단위로 파라미터를 고치는 훈련 방법
경사 하강법 · 배치 경사 하강법 · 확률적 경사 하강법 · 미니배치 경사 하강법 · 역전파 · 손실 함수 · 학습률 · 그래디언트 누적
배치 계산을 빠르게 하는 장비와 연산
GPU · 디바이스 메모리 · 행렬 곱셈 · 텐서 · 벡터화 · SIMD
요청을 묶을 때 저울질하는 성능 지표
처리량 · 지연 · 꼬리 지연 · 첫 토큰까지의 시간 · 메모리 부족
요청을 배치로 묶는 서빙 기법
동적 배칭 · 연속 배칭 · 모델 서빙 · 배치 추론 · 온라인 추론
배치 단위로 계산하는 신경망 기법
배치가 쓰이는 상위 분야와 단계
배치와 이름이 겹치는 다른 개념
다른 이름: batch