programming13 MIN READ

[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)