[MLOps] KoGPT 추론 속도 실험
[MLOps] kogpt inference 속도 실험
실험 1. 모델을 8bit로 로딩
code
# pip install transformers accelerate bitsandbytes
# -*- coding: utf-8 -*-
import time
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("kakaobrain/kogpt", revision="KoGPT6B-ryan1.5b-float16", load_in_8bit=True, torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained('kakaobrain/kogpt', revision='KoGPT6B-ryan1.5b-float16')
model.eval()
def inference(prompt):
start = time.time()
tokens = tokenizer.encode(prompt, return_tensors='pt').to(device='cuda', non_blocking=True)
gen_tokens = model.generate(tokens, do_sample=False, max_length=64)
generated = tokenizer.batch_decode(gen_tokens)[0]
end = time.time()
print(generated.strip())
print(f"it takes {end-start} seconds")
if __name__ == "__main__":
prompt = '인간처럼 생각하고, 행동하는 \'지능\'을 통해 인류가 이제까지 풀지 못했던'
inference(prompt)
inference(prompt)
inference(prompt)
- 학습과 제일 유사한 환경에서의 테스트
g4dn.xlarge
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 11.030531644821167 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 9.844014644622803 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 9.85619068145752 seconds
p3.2xlarge
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 13.593952894210815 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 11.567946195602417 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 11.565444707870483 seconds
g5.xlarge
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 8.977914810180664 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 7.46333122253418 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 7.541332960128784 seconds
실험 2. fp16 테스트
- fp16을 활용하면, 전용의 tensor core가 동작할 수 있어서 int8보다 오히려 빨라짐
load_in_8bit=True옵션 제거
g4dn.2xlarge
- g4dn.xlarge에서는 memory가 부족해서 실행 불가능
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 4.417008399963379 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 3.5028903484344482 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 3.500816822052002 seconds
p3.2xlarge
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 4.876116752624512 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 3.0571510791778564 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 3.0621068477630615 seconds
g5.2xlarge
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 3.47536563873291 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 2.3292360305786133 seconds
인간처럼 생각하고, 행동하는 '지능'을 통해 인류가 이제까지 풀지 못했던 난제를 해결할 수 있을 것으로 기대된다.
it takes 2.3290302753448486 seconds
실험. Batch Size 테스트
code
base
# -*- coding: utf-8 -*-
import time
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("kakaobrain/kogpt", revision="KoGPT6B-ryan1.5b-float16", load_in_8bit=True, torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained('kakaobrain/kogpt', revision='KoGPT6B-ryan1.5b-float16')
model.eval()
def batch_inference(prompts):
start = time.time()
encoded_inputs = tokenizer(prompts, return_tensors='pt')
print(encoded_inputs)
encoded_inputs.to(device='cuda')
generated_tokens = model.generate(input_ids=encoded_inputs['input_ids'], do_sample=False, max_length=64)
results = tokenizer.batch_decode(generated_tokens)
end = time.time()
print(f"it takes {end-start} seconds")
if __name__ == "__main__":
prompt = '인간처럼 생각하고, 행동하는 \'지능\'을 통해 인류가 이제까지 풀지 못했던'
batch_size = 1
while 1:
print(f"batch size: {batch_size}")
batch_inference([prompt]*batch_size)
batch_size = batch_size * 2
vLLM
import time
from vllm import LLM, SamplingParams
sp = SamplingParams(max_tokens=64)
llm = LLM(model="kakaobrain/kogpt", revision="KoGPT6B-ryan1.5b-float16")
prompt = '인간처럼 생각하고, 행동하는 \'지능\'을 통해 인류가 이제까지 풀지 못했던'
batch_size = 1
while 1:
start = time.time()
print(f"batch size: {batch_size}")
prompts = [prompt] * batch_size
outptus = llm.generate(prompts, sp)
end = time.time()
print(f"it takes {end-start} seconds")
batch_size = batch_size * 2
- g5.2xlarge에서 모두 비교하였음
- batch size를 2배씩 증가하면서, max batch size를 확인
8bit
batch size: 1
it takes 7.397524118423462 seconds
batch size: 2
it takes 7.403080224990845 seconds
batch size: 4
it takes 7.556253671646118 seconds
batch size: 8
it takes 7.440000534057617 seconds
batch size: 16
it takes 7.497692346572876 seconds
batch size: 32
it takes 7.78251838684082 seconds
batch size: 64
it takes 9.030970811843872 seconds
batch size: 128
it takes 10.161896467208862 seconds
batch size: 256
GPU Out Of memory Error
fp16
batch size: 1
it takes 2.3142383098602295 seconds
batch size: 2
it takes 2.3519957065582275 seconds
batch size: 4
it takes 2.351057767868042 seconds
batch size: 8
it takes 2.381054639816284 seconds
batch size: 16
it takes 2.4842803478240967 seconds
batch size: 32
it takes 2.7864227294921875 seconds
batch size: 64
it takes 4.3793816566467285 seconds
batch size: 128
GPU Out Of memory Error
fp16 + vllm
batch size: 1
it takes 1.831343412399292 seconds
batch size: 2
it takes 1.9201066493988037 seconds
batch size: 4
it takes 2.0918827056884766 seconds
batch size: 8
it takes 2.4617953300476074 seconds
batch size: 16
it takes 3.232037305831909 seconds
batch size: 32
it takes 4.86451530456543 seconds
batch size: 64
it takes 7.75148606300354 seconds
batch size: 128
it takes 13.946491479873657 seconds
batch size: 256
it takes 29.273810625076294 seconds
batch size: 512
it takes 58.2059121131897 seconds
batch size: 1024
it takes 115.87804746627808 seconds
batch size: 2048
it takes 234.07658767700195 seconds
Results
| 8bit | fp16 | fp16 + vllm | ||||
| seconds | request/second | seconds | request/second | seconds | request/second | |
| batch: 1 | 7.4 | 0.14 | 2.3 | 0.43 | 1.8 | 0.56 |
| batch: 2 | 7.4 | 0.27 | 2.4 | 0.83 | 1.9 | 1.05 |
| batch: 4 | 7.5 | 0.53 | 2.4 | 1.67 | 2.0 | 2.00 |
| batch: 8 | 7.4 | 1.08 | 2.4 | 3.33 | 2.5 | 3.20 |
| batch: 16 | 7.6 | 2.11 | 2.5 | 6.40 | 3.2 | 5.00 |
| batch: 32 | 7.8 | 4.10 | 2.8 | 11.43 | 4.9 | 6.53 |
| batch: 64 | 9 | 7.11 | 4.4 | 14.55 | 7.7 | 8.31 |
| batch: 128 | 10 | 12.8 | Error | - | 14 | 9.14 |
| batch: 256 | Error | - | 29 | 8.83 | ||
| batch: 512 | 58 | 8.83 | ||||
| batch: 1024 | 115 | 8.90 | ||||
| batch: 2048 | 234 | 8.75 |
Appendix
Instance Spec
g4dn.xlarge
CPU: 4 core memory: 16GB GPU: T4 16GB (tensor core: 320)
g4dn.2xlarge
CPU: 8 core memory: 32GB GPU: T4 16GB (tensor core: 320)
p3.2xlarge
CPU: 8 core memory: 61GB GPU: V100 16GB (tensor core: 640)
g5.xlarge
CPU: 4 core memory: 16GB
GPU: a10g 24G (tensor core: 320)
g5.2xlarge
CPU: 8 core memory: 32GB
GPU: a10g 24G (tensor core: 320)