NVIDIA H20-3e 141G Docker LLaMA Factory 训练与vllm 推理实战:解锁 Qwen ...

打印 上一主题 下一主题

主题 2057|帖子 2057|积分 6181

简介

本文深度解析基于 NVIDIA H20-3e 141G GPU 的 AI 开辟全流程,重点出现其相比前代 H20 在硬件架构、显存容量(141GB vs 96GB)及计算服从上的跨越式升级。通过 LLaMA Factory 框架实现 Qwen2.5-14B 模型的监视微调(SFT)训练,结合 Transformer 引擎与多实例 GPU 技能,突破传统显存限制,实现混合精度训练吞吐量提拔。在推理环节,vllm 引擎借助 H20-3e 的 FP8 计算焦点与更快的 NVLink 互联,使 DeepSeek-R1-FP8 671B 超大模型的全量推理成为现实,实测单卡吞吐量较 H20 提拔倍,同时保持数值精度一致性。文章还对比了 H20-3e 在训练稳定性、推理延迟等方面的优化表现,验证其作为新一代 AI 计算平台的技能上风。
平台部门

驱动安装

起首需要安装NVIDIA-driver-xxx以及NVIDIA Fabricmanager-xxx,这两者都可以通过apt安装大概通过NVIDIA 官网进行下载安装,安装部门不再赘述,此中后者尤其重要,因为其关乎NVLINK能否正常使用



安装docker

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
复制代码
  1. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
复制代码
  1. sudo apt update
复制代码
  1. sudo apt install docker-ce docker-ce-cli containerd.io
复制代码
配置NVIDIA-docker-toolkit

  1. curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  2.   && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  3.     sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  4.     sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
复制代码
  1. sudo apt-get install -y nvidia-container-toolkit
复制代码
  1. sudo nvidia-ctk runtime configure --runtime=docker
复制代码
  1. sudo systemctl restart docker
复制代码
如果运行完上述代码后没有报错,阐明已经安装乐成
简单测试

直接从NGC拖适合驱动版本的m5c镜像,之后从GitHub - NVIDIA/cuda-samples at v12.4.1
与GitHub - wilicc/gpu-burn: Multi-GPU CUDA stress test,中下载即可
P2P 性能简单测试



GPU burn测试

不知道为什么,在跑到将近30秒的时候算力会突然倍增


训练部门

下载镜像

从NGC 镜像站中下载较新的pytorch 镜像PyTorch | NVIDIA NGC
  1. docker pull nvcr.io/nvidia/pytorch:xx.xx-py3
复制代码
然后本地通过下面的下令启动镜像,此中,network与ipc=host较为重要,决定了容器内网络的状态以及宿主机答应直通给容器的资源数目和性能
  1. docker run -v 宿主机路径:容器内需要挂在的路径 --privileged --network=host --ulimit stack=68719476736  --ipc=host --entrypoint=/bin/bash --gpus all -it nvcr.io/nvidia/pytorch:xx.xx-py3
复制代码
安装LLAMA Factory

  1. git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
复制代码
  1. cd LLaMA-Factory
复制代码
  1. pip install -e ".[torch,metrics]"
复制代码
在输入上述下令后,可能会出现一些在线或离线安装pip包的过程,此中有些包的兼容性可能存在辩论,但是如果是不常用的包可以直接不管
乐成安装后,输入下面的下令,能乐成运行即为安装乐成
  1. llamafactory-cli version
复制代码

修改SFT配置文件

进入examples/train_lora/llama3_lora_sft.yaml配置文件

重要需要修改的有几点
modelnameorpah:根据本地或云端模型的路径位置修改
trust_remote_code: 如果模型在本地就删掉,如果是云端模型需要下载的就保留
dataset:数据集实际路径,也可以选择/data目录下有的示例数据集
cutoff lengh:实际输入padding长度,根据实际数据集输入修改
batch_size与accumulation_step:按需修改
启动训练

进入LLaMa factory 工程主目录
  1. llamafactory-cli train ./examples/train_lora/llama3_lora_sft.yaml
复制代码
训练占用

最后出现下图结果,即为训练完成

推理部门

下载镜像

  1. docker pull docker.io/vllm/vllm-openai:v0.7.3
复制代码
  1. docker run -v 宿主机路径:容器内需要挂在的路径 --privileged --network=host --ulimit stack=68719476736  --ipc=host --entrypoint=/bin/bash --gpus all -it docker.io/vllm/vllm-openai:v0.7.3
复制代码
启动后输入
  1. vllm -v
复制代码
出现下图即为安装乐成

运行推理

起首,下载好全量的FP8 DeepSeek-R1 模型,然后输入(deepseek的模型推理命名一般就为deepseek-reasoner)
  1. python3 -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --max-model-len 65536 --max-num-batched-tokens 65536 --trust-remote-code --tensor-parallel-size 8 --gpu-memory-utilization 0.9 --served-model-name deepseek-reasoner   --model 容器内模型路径
复制代码
最后出现图片中的结果,即为部署乐成

实际部署占用

API 调用

起首需要pip 安装 openai
单并发
  1. from openai import OpenAI
  2. client = OpenAI(
  3.     base_url="http://localhost:8000/v1",
  4.     api_key="token-abc123",
  5. )
  6. completion = client.chat.completions.create(
  7.   model="deepseek-reasoner",
  8.   messages=[
  9.     {"role": "user", "content": "Hello!"}
  10.   ]
  11. )
  12. print(completion.choices[0].message.content)
复制代码


  1. from openai import OpenAI
  2. import threading
  3. import queue
  4. import sys
  5. from concurrent.futures import ThreadPoolExecutor, as_completed
  6. class AsyncStreamProcessor:
  7.     def __init__(self, base_url="http://localhost:8000/v1", max_workers=4):
  8.         self.client = OpenAI(base_url=base_url, api_key="None")
  9.         self.max_workers = max_workers
  10.         self.executor = ThreadPoolExecutor(max_workers=max_workers)
  11.     def process_stream(self, response, output_queue):
  12.         try:
  13.             for chunk in response:
  14.                 if chunk.choices[0].delta.content is not None:
  15.                     output_queue.put(chunk.choices[0].delta.content)
  16.         except Exception as e:
  17.             output_queue.put(f"Error: {str(e)}")
  18.         finally:
  19.             output_queue.put(None)
  20.     def print_output(self, output_queue, request_id):
  21.         while True:
  22.             content = output_queue.get()
  23.             if content is None:
  24.                 break
  25.             print(f"Request {request_id}: {content}", end="", flush=True)
  26.         print()  # Final newline
  27.     def process_single_request(self, prompt, request_id):
  28.         output_queue = queue.Queue()
  29.         
  30.         try:
  31.             response = self.client.chat.completions.create(
  32.                 model="/root/model/DeepSeek-R1-Distill-Qwen-32B/",
  33.                 messages=[
  34.                     {
  35.                         "role": "user",
  36.                         "content": [
  37.                             {
  38.                                 "type": "text",
  39.                                 "text": prompt
  40.                             }
  41.                         ],
  42.                     }
  43.                 ],
  44.                 temperature=0.6,
  45.                 stream=True
  46.             )
  47.             # Create and start the stream processing thread
  48.             stream_thread = threading.Thread(
  49.                 target=self.process_stream,
  50.                 args=(response, output_queue)
  51.             )
  52.             stream_thread.start()
  53.             # Create and start the printing thread
  54.             print_thread = threading.Thread(
  55.                 target=self.print_output,
  56.                 args=(output_queue, request_id)
  57.             )
  58.             print_thread.start()
  59.             # Wait for both threads to complete
  60.             stream_thread.join()
  61.             print_thread.join()
  62.             return f"Request {request_id} completed"
  63.         except Exception as e:
  64.             return f"Request {request_id} failed: {str(e)}"
  65.     def process_multiple_requests(self, prompts):
  66.         futures = []
  67.         
  68.         # Submit all requests to the thread pool
  69.         for idx, prompt in enumerate(prompts):
  70.             future = self.executor.submit(
  71.                 self.process_single_request,
  72.                 prompt,
  73.                 idx + 1
  74.             )
  75.             futures.append(future)
  76.         # Wait for all requests to complete and get results
  77.         results = []
  78.         for future in as_completed(futures):
  79.             results.append(future.result())
  80.         return results
  81.     def shutdown(self):
  82.         self.executor.shutdown(wait=True)
  83. def main():
  84.     # Example prompts
  85.     prompts = [
  86.         """已知函数 $f(x) = \ln \frac{x}{2-x} + ax + b(x-1)^3$
  87. (1) 若 $b=0$,且 $f'(x) \geq 0$,求 $a$ 的最小值;""",
  88.         """已知函数 $f(x) = \ln \frac{x}{2-x} + ax + b(x-1)^3$
  89. (2) 证明:曲线 $y=f(x)$ 是中心对称图形;""",
  90.         """已知函数 $f(x) = \ln \frac{x}{2-x} + ax + b(x-1)^3$
  91. (3) 若 $f(x) > -2$ 当且仅当 $1 < x < 2$,求 $b$ 的取值范围。"""
  92.     ]
  93.     # Initialize the processor with 4 worker threads
  94.     processor = AsyncStreamProcessor(max_workers=4)
  95.    
  96.     try:
  97.         # Process all requests
  98.         results = processor.process_multiple_requests(prompts)
  99.         
  100.         # Print final results
  101.         print("\nFinal results:")
  102.         for result in results:
  103.             print(result)
  104.    
  105.     finally:
  106.         # Ensure the thread pool is properly shut down
  107.         processor.shutdown()
  108. if __name__ == "__main__":
  109.     main()
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表