안녕하세요
아래 내용 해결을 위해서, 비용을 지불하려고 합니다.
문제 해결이 가능한 분은 연락 주시기 바랍니다.
01*-****-****
대략적인 내용을 설명 드리자면,
HPE DL380aG11 (2U장비임에도 GPU 4EA 까지 장착 가능) H100 80GB 2EA를 장착 하였습니다.
한개 씩 돌리면 성능이 잘 나오고 있으나 두 개를 동시에 돌리면 처리 속도가 매우 느립니다.
고객이 하드웨어를 의심해서 DL380aG11 이외에 다른 DL380G11 , ASUS 4세대 CPU 서버에서 테스트를 하였으나, 결과는 모두 동일 합니다.
GPU 장애는 아닙니다. 저희가 GPU 서버를 많이 납품 하였습니다. 보통 GPU를 사용 하는 고객측에서 소프트웨어에서 수정 해주어서 문제를 해결 하는데...
일단 브릿지로 연결해서 테스트 해보려는데, 결과는 좋지 않을거 같습니다.
그동안 테스트 내용 아래 정리해서 알려 드리니, 해결이 가능할거 같은신분은 연락 주시기 바랍니다.
- 1. OS : Ubuntu 22.04.2
- 2. CUDA Version : 12. 2
- 3. H100 Drive Version : 535.129.03
- 4. 사용중인 프로그램 : Python 3.11.X
- 5. 처리 속도 H100 80G * 2EA
- Llama-3-8B처리시간 : 2.4
- H100 80G * 1EA
- Llama-3-8B 처리 시간 : 0.5초
- 비교군 GPU A100 80G
- A100 80G * 2EA
- Llama-3-70B 처리 시간 : 2.7초
- A100 80G * 1EA
- Llama-3-8B 처리 시간 : 1.2초
- 한 개를 돌렸을때는 H100 GPU가 A100 GPU 보다 2배가 빠른데
- 2장을 같이 돌렸을 때는 A100 GPU는 2.7초 이고 H100 GPU는 2.4초가 나오고 있습니다.
테스트 한 코드는 아래와 같습니다.
from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer, TextStreamer
import torch
from threading import Thread
import gradio as gr
import time
#import accelerate_speedup
torch.manual_seed(42)
model_id = "meta-llama/Meta-Llama-3-70B-Instruct"
#model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
#max_memory_mapping = {0: "80GB", 1: "80GB"}
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
#device_map="balanced_low_0",
trust_remote_code=True,
attn_implementation="flash_attention_2",
low_cpu_mem_usage=True
#max_memory=max_memory_mapping
).eval()
terminators = [
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
### base inference
def chat(question):
messages = [
#{"role": "system", "content": "You are AI chatbot. You are honest, do not harm others, and help users."},
{"role": "system", "content": "Please try to provide useful, helpful answers."},
{"role": "user", "content": question},
]
input_ids = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device, non_blocking=True)
outputs = model.generate(
input_ids,
max_new_tokens=1024,
eos_token_id=terminators,
do_sample=True,
temperature=0.05,
top_p=0.95,
)
response = outputs[0][input_ids.shape[-1]:]
#print(tokenizer.decode(response, skip_special_tokens=True))
return tokenizer.decode(response, skip_special_tokens=True)
response_times = []
for _ in range(100):
start_time = time.time()
#tmp = chat('hello.')
tmp = chat('hello!')
#tmp = chat('Testing. Please answer in 10,000 characters.')
end_time = time.time()
print((end_time - start_time))
response_times.append(end_time - start_time)
print(f"Average Response Time: {sum(response_times) / len(response_times):.2f} seconds")
각각 CPU가 배정된 익스프레스 슬롯에 장착한건지가 관건일거 같아요.
제 경험에 몇몇 파라미터 설정을 변경하는 것을 주석처리 여부로만 할 경우 실수하는 경우가 많았습니다.
for 문으로 돌리면 이전 변수값이 남아 있어 오류가 나는 경우도 많구요.
위의 코드도 보면 device_map과 max_memory 부분이 주석 처리를 변경하면서 테스트하는 것으로 보입니다.
다양한 조건에서 초단위로 성능을 평가해야 하는 상황이라면, 해당 설정 부분만 정확하게 수정한 파일 4개를 만들어서 확인해 보는 것이 좋을 것 같습니다.
대부분 결과가 3초 이내에 나오면 nvidia-smi 등으로 GPU 상태를 볼 때에 시간이 너무 짧기 때문에 더 긴 시간 동안 테스트 할 수 있도록 하는 것이 좋을 것 같습니다.