H100 80GB 2개 병렬로 사용시 처리 속도 저항

한중일   
   조회 2496   추천 0    

안녕하세요

아래 내용 해결을 위해서, 비용을 지불하려고 합니다.

문제 해결이 가능한 분은  연락 주시기 바랍니다.

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

 


짧은글 일수록 신중하게.
술이 2024-06
같은 CPU 레인에 꼽아서 8배속으로 쪼개진게 아닐까 생각드는데...
각각 CPU가 배정된 익스프레스 슬롯에 장착한건지가 관건일거 같아요.
트니아빠 2024-06
위의 코드를 테스트 할 수 있는 환경이 아니고, 딥러닝에서 손 땐지 오래되어서 그냥 느낌으로 봤습니다.

제 경험에 몇몇 파라미터 설정을 변경하는 것을 주석처리 여부로만 할 경우 실수하는 경우가 많았습니다.
for 문으로 돌리면 이전 변수값이 남아 있어 오류가 나는 경우도 많구요.

위의 코드도 보면 device_map과 max_memory 부분이 주석 처리를 변경하면서 테스트하는 것으로 보입니다.

다양한 조건에서 초단위로 성능을 평가해야 하는 상황이라면, 해당 설정 부분만 정확하게 수정한 파일 4개를 만들어서 확인해 보는 것이 좋을 것 같습니다.

대부분 결과가 3초 이내에 나오면 nvidia-smi 등으로 GPU 상태를 볼 때에 시간이 너무 짧기 때문에 더 긴 시간 동안 테스트 할 수 있도록 하는 것이 좋을 것 같습니다.
검은콩 2024-06
Vllm 테스트해보시죠


QnA
제목Page 564/5707
2015-12   1671263   백메가
2014-05   5136430   정은준1
2022-08   2376   써린이
2020-09   2376   Dishy
2022-12   2376   장동건2014
2021-07   2376   어훕
2023-11   2376   헌터D
2021-04   2376   김제l김용환
2023-12   2376   haniy
2020-01   2377   그린
2018-12   2377   쿨쿨쿨
2021-04   2377   dogbull
2020-12   2377   영산회상
2022-09   2377   나우마크
2020-09   2377   Whitesun
2023-04   2378   눈부신아침
2021-07   2378   NGC
2021-07   2378   돌아온디드
2019-01   2378   비엘이브
2021-03   2378   테츠
2021-06   2378   Sikieiki
2020-05   2378   분당김동수