안녕하세요
아래 내용 해결을 위해서, 비용을 지불하려고 합니다.
문제 해결이 가능한 분은 연락 주시기 바랍니다.
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 »óŸ¦ º¼ ¶§¿¡ ½Ã°£ÀÌ ³Ê¹« ª±â ¶§¹®¿¡ ´õ ±ä ½Ã°£ µ¿¾È Å×½ºÆ® ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ ÁÁÀ» °Í °°½À´Ï´Ù.