手把手教你驯服DeepSeek-R1!部署+测试+性能优化万字全攻略

↑ 点击蓝字 关注极市平台
作者丨Mr.Felix
编辑丨极市平台

极市导读

 

本文详细介绍了如何部署和测试DeepSeek-R1模型,涵盖了从Ollama到vLLM的多种推理框架的安装与配置,并提供了性能测试结果和优化建议,帮助用户在多机多卡环境下高效运行大模型。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

一、Ollama

1、直接运行:curl -fsSL https://ollama.com/install.sh | sh
运行如果报网络错误则参考链接进行手动下载安装并设置自启动。

2、参考链接设置ollama保存模型的路径和设置监听端口。

3、选择合适模型,运行命令:ollama run deepseek-r1:1.5b
DeepSeek-R1-Distill-Qwen-1.5B单卡2080Ti显存占用1902MiB。

4、参考链接设置远程部署,并在客户端用Chatbox访问;

二、vLLM

ollama部署类似docker的方式,好处是比较简单易上手,但对于生产环境来说,可配置功能简单、不支持多机部署、高并发下性能差、只支持量化版本模型等。

为此,我们选择DeepSeek官方推荐的4种推理框架之一的vLLM。

官方有两种安装方式:python本地安装和docker安装[链接]。

硬件:
3台相同配置的服务器:
操作系统:18.04.6 LTS
显卡:RTX2080Ti*8
内存:376GB
磁盘:1TB

(一)python本地安装

官方安装最简单,直接运行:pip install vllm,但下载缓慢且如果本地cuda版本不对xformers编译会报错。建议将以下文件先下载到本地(如果采用其他版本注意兼容性):

Anaconda3-2021.05-Linux-x86_64.sh
NVIDIA-Linux-x86_64-535.230.02.run
cuda_11.8.0_520.61.05_linux.run
torch-2.5.1+cu118-cp311-cp311-linux_x86_64.whl
torchvision-0.20.1+cu118-cp311-cp311-linux_x86_64.whl
vllm-0.7.2+cu118-cp38-abi3-manylinux1_x86_64.whl

1. 安装Nvidia驱动和cuda

注意nvidia-smi查看驱动版本和cuda版本,理论上驱动版本相近即可。可参考链接安装驱动,注意安装时退出会调用到GPU的程序,比如Ollama。

cuda可在链接下载,安装直接运行.run即可。

2. anaconda安装并创建虚拟环境

sudo chmod 777 ./Anaconda3-2021.05-Linux-x86_64.sh

sudo ./Anaconda3-2021.05-Linux-x86_64.sh 按照提示安装并初始化,重新进入中断看到前缀(base)即安装成功

conda create -n LLM python=3.11 -y

conda activate LLM

如果在其他服务器已经安装好了虚拟环境,建议直接打包过来解压即可使用。

打包:

conda install -c conda-forge conda-pack
conda pack -n LLM -o LLM.tar.gz --ignore-editable-packages

解压:

sudo mkdir -p /home/ubuntu/anaconda3/envs/LLM
sudo tar -xzf ./LLM.tar.gz -C /home/ubuntu/anaconda3/envs/LLM

conda activate LLM即可使用。

如果出现“terminals database is inaccessible”,添加环境变量:

sudo vim ~/.bashrc
export TERMINFO=/usr/share/terminfo
export TERM=vt100
source ~/.bashrc

3. 安装torch

pip install ./torch-2.5.1+cu118-cp311-cp311-linux_x86_64.whl -i

https://pypi.tuna.tsinghua.edu.cn/simple

pip install ./torchvision-0.20.1+cu118-cp311-cp311-linux_x86_64.whl -i

https://pypi.tuna.tsinghua.edu.cn/simple

4. 安装vLLM

pip install ./vllm-0.7.2+cu118-cp38-abi3-manylinux1_x86_64.whl -i

https://pypi.tuna.tsinghua.edu.cn/simple

期间编译xformers需要几分钟,随后就安装成功。

5. 挂载模型目录

sudo mount -t cifs //<数据服务器IP>/<多级目录>/DeepSeek /home/ubuntu/DeepSeek -o username=<用户名>,password=<密码>

避免模型文件需备份到各个服务器。

6. 单机多卡运行

CUAD_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m vllm.entrypoints.openai.api_server<br> 
--model ~/DeepSeek/DeepSeek-R1-Distill-Qwen-32B --host 0.0.0.0 --port 11435 <br> 
--tensor-parallel-size 8 --gpu-memory-utilization 0.9 --max-model-len 8192 --trust-remote-code <br> 
--enforce_eager --dtype=half

7. 设置防火墙

需关闭防火墙或开放指定范围端口,以免节点通信受阻或经常掉线。

sudo ufw disable<br> 
sudo systemctl stop firewalld

8. 配置网卡、NCCL环境变量

运行ip addr查看本地IP对应网卡名称,一般为eno1。

在~/.bashrc写入下面环境变量:

# 指定通信网卡
export GLOO_SOCKET_IFNAME=eno1
export TP_SOCKET_IFNAME=eno1
# NCCL配置
export NCCL_SOCKET_IFNAME=eno1
export NCCL_DEBUG=info
export NCCL_NET=Socket
export NCCL_IB_DISABLE=0

保证socket和NCCL通信顺畅,否则会出现节点连接不上的问题。

9. 部署ray节点

在根节点服务器运行:

ray start --head --dashboard-host 0.0.0.0

在子节点服务器运行:

ray start --address='<主节点服务器IP>:6379'

ray status查看节点状态

10. 多机多卡运行

以3台服务器为例:

vllm serve ~/DeepSeek/DeepSeek-R1-Distill-Llama-70B --tensor-parallel-size 8  
--pipeline-parallel-size 3 --max-model-len 8192 --trust-remote-code --enforce_eager --dtype=half 
--host 0.0.0.0 --port 11435

(二)docker安装

1. 更新安装Nvidia驱动和cuda

注意nvidia-smi查看驱动版本和cuda版本,理论上驱动版本相近即可。

可参考链接安装驱动,vllm-openai:v0.7.2镜像要求驱动版本>530。注意安装时退出会调用到GPU的程序,比如Ollama。

cuda可在链接下载,安装直接运行.run即可。

2. 设置docker权限和环境变量

sudo groupadd docker
sudo gpasswd -a ubuntu docker
newgrp docker
  1. 安装nvidia-container-toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker

sudo vim /etc/docker/daemon.json

添加以下内容:

{
  "default-runtime""nvidia",
  "runtimes": {
    "nvidia": {
      "path""nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}
sudo systemctl restart docker

4. 加载镜像

按照官方文档下载官方镜像:docker pull vllm/vllm-openai:v0.7.2

但文件较大容易下载失败,建议在网络较好的环境下载好后打包到目标服务器。

docker load -i vllm-openai.tar
docker images
docker tag f78c8f2f8ad5 <镜像服务器IP>/ai_product/vllm-openai:v0.7.2

5. 挂载模型目录

sudo mount -t cifs //<数据服务器IP>/<多级目录>/DeepSeek /home/ubuntu/DeepSeek -o username=<用户名>,password=<密码>

避免模型文件需备份到各个服务器。

6. 单机多卡运行

docker run --runtime nvidia --gpus all \
 --name vllm_serve \
    -v ~/DeepSeek:/root/DeepSeek \
    -p 11436:8000 \
    <镜像服务器IP>/ai_product/vllm-openai:v0.7.2 \
    --model /root/DeepSeek/DeepSeek-R1-Distill-Qwen-1.5B \
 --dtype=half

三、API调用配置

推荐使用chatbox或chrome插件Page Assist(支持联网搜索)

OPENAI API
APi密钥:EMPTY
API域名:http://<主节点服务器IP>:11435/v1
模型:自定义模型
模型名:/home/ubuntu/DeepSeek/DeepSeek-R1-Distill-Llama-70B

如果需要使用知识库,则推荐Cherry Studio。

Ollama API
APi密钥:EMPTY
API域名:http://<服务器IP>:11434
模型ID:nomic-embed-text

1. 谷歌浏览器插件Page Assist

2. VS Code插件Cline

3. WPS插件OfficeAI

下载https://www.office-ai.cn/并安装,打开WPS就可以配置本地大模型,目前支持文案生成、润色等功能。

4. Cherry Studio知识库

参考链接(https://mp.weixin.qq.com/s/4WZL9eXAKyLivb4NXHuBQA)创建本地知识库。

四、简单测试

本测试推理框架采用vLLM0.7.2,安装环境基于python本地安装。

硬件环境:382080Ti

部署模型:DeepSeek-R1-Distill-Qwen-32B和DeepSeek-R1-Distill-Llama-70B

1. 资源占用

2. 回答

提问:ubuntu如何安装nvidia显卡驱动

结论: 671B模型的回答方案更加全面,且有可能存在的异常问题的解决办法,70B的回答虽然不全面,但是方案是最常用的,且步骤没有问题。

本地部署70B:

<think>

好吧,我现在要在Ubuntu上安装NVIDIA的显卡驱动。首先,我对Linux不是很熟悉,所以得慢慢来。让我先理清楚步骤。


首先,我应该检查一下我的显卡型号。听说可以通过终端命令来查看,lspci | grep -i nvidia,这样就能看到显卡的信息了。然后记下这个型号,可能后面会用到。


接下来,我需要知道当前的Ubuntu版本。可以用lsb_release -a命令来查看。我记得不同的Ubuntu版本可能支持不同的驱动版本,所以这一步挺重要的。


然后,访问NVIDIA的官方网站,找到驱动程序的下载页面。在那里,应该有一个自动检测工具,或者手动选择显卡型号和操作系统。我需要选择Linux版本,然后按照指示下载合适的驱动。


不过,我也听说Ubuntu有一个附加组件库,里面有很多预编译的驱动。使用这个可能会更方便,不用手动下载和安装。所以,可能可以用Ubuntu的软件更新器来安装驱动。


我还需要禁用开源的Nouveau驱动,因为它可能会和NVIDIA的驱动冲突。禁用的话,可以通过编辑黑名单文件,添加“blacklist nouveau”,然后更新初始化ramdisk。重启之后,Nouveau就不会再加载了。


安装驱动的时候,有两种方法:一种是通过.run文件手动安装,另一种是使用apt-get从官方仓库安装。我觉得用仓库的方法可能更简单,因为这样可以通过包管理器来处理依赖和更新。


不过,如果用.run文件的话,安装完成后可能需要配置Xorg服务器。这可能有点复杂,我得按照指示来,免得弄坏系统。


安装完成后,重启系统是必须的,然后通过nvidia-smi命令来确认驱动是否正确加载。这样就能看到GPU的信息了。


另外,还有一些可选的工具,比如NVIDIA X Server设置和GPU监控工具,可以安装这些来更好地管理显卡。


如果在安装过程中遇到问题,可能需要重新启用Nouveau驱动,或者检查是否有其他冲突的包。我可能需要查阅一些论坛或者文档来解决问题。


总之,我觉得最简单的方法是通过Ubuntu的软件更新器来安装驱动,这样比较省事,而且有官方支持。先禁用Nouveau,然后添加NVIDIA的仓库,安装驱动,重启,验证一下。希望一切顺利。


</think>

Ubuntu上安装NVIDIA显卡驱动,可以按照以下步骤操作:


### 步骤 1:检查显卡信息和Ubuntu版本

1. 打开终端,输入以下命令查看显卡型号:

“`bash

lspci | grep -i nvidia

“`

记录下显卡型号。

2. 检查Ubuntu版本:

“`bash

lsb_release -a

“`

### 步骤 2:禁用开源驱动Nouveau

1. 编辑黑名单文件:

“`bash

sudo nano /etc/modprobe.d/blacklist-nvidia.conf

“`

添加以下内容:

“`

blacklist nouveau

options nouveau modeset=0

“`

2. 更新初始化ramdisk

“`bash

sudo update-initramfs -u

“`

3. 重启系统:

“`bash

sudo reboot

“`

### 步骤 3:安装NVIDIA驱动

#### 方法一:通过Ubuntu软件更新器安装

1. 打开“软件与更新”工具,在Ubuntu Dock或应用程序中找到。

2. 转到“附加驱动”选项卡,找到NVIDIAproprietary驱动。

3. 选择推荐的驱动版本,点击“应用”进行安装。

4. 等待安装完成后,重启系统:

“`bash

sudo reboot

“`

#### 方法二:通过官方仓库安装

1. 添加NVIDIA官方仓库:

“`bash

sudo add-apt-repository ppa:graphics-drivers/ppa

sudo apt update

“`

2. 安装推荐的驱动包:

“`bash

ubuntu-drivers devices

sudo ubuntu-drivers autoinstall

“`

3. 重启系统:

“`bash

sudo reboot

“`

#### 方法三:手动下载.run文件安装

1. 访问[NVIDIA驱动下载页面](https://www.nvidia.com/Download/index.aspx),选择合适的驱动下载.run文件。

2. 进入下载目录,赋予执行权限并运行:

“`bash

chmod +x NVIDIA-Linux-x86_64-<version>.run

sudo ./NVIDIA-Linux-x86_64-<version>.run

“`

3. 按照安装向导完成安装,重启系统。

### 步骤 4:验证安装

1. 重启后,打开终端,输入:

“`bash

nvidia-smi

“`

查看是否显示GPU信息,确认驱动加载成功。

2. 可选安装NVIDIA设置工具:

“`bash

sudo apt install nvidia-settings

“`

打开工具检查显卡状态。


### 可选步骤:安装CUDA工具包(如需)


1. 如果需要CUDA支持,访问[NVIDIA CUDA页面](https://developer.nvidia.com/cuda-downloads)下载合适的版本。


2. 按照指示安装CUDA toolkit


### 故障排除

如果安装失败,检查是否正确禁用了Nouveau,确保没有其他冲突的包。

查阅[Ubuntu官方文档](https://help.ubuntu.com/community/BinaryDriverHowto/Nvidia)[NVIDIA Linux驱动文档](https://download.nvidia.com/XFree86/Linux-x86_64/515.65.01/README/index.html)获取更多帮助。


通过以上步骤,你应该能够成功在Ubuntu上安装NVIDIA显卡驱动。

DeepSeek R1(671B)

好的,我现在需要帮助用户在Ubuntu系统上安装NVIDIA显卡驱动。让我先回忆一下相关的步骤和可能遇到的问题,确保提供准确的信息。


首先,用户可能使用的是Ubuntu的桌面版或服务器版,不同的版本可能在安装过程中有细微差别,但总体步骤应该类似。安装NVIDIA驱动通常有几种方法:使用Ubuntu的仓库、使用PPA源,或者直接从NVIDIA官网下载.run文件手动安装。不过,手动安装可能会比较复杂,尤其是对于新手来说,所以推荐使用仓库或PPA的方法更安全。


接下来,我需要考虑用户可能使用的Ubuntu版本,比如20.0422.04或者24.04,不同版本的软件包名称或仓库可能有所不同。但一般来说,步骤是相似的。首先应该推荐使用Ubuntu自带的软件和更新工具,这是图形界面,对用户来说可能更友好。用户可以在附加驱动选项卡中选择合适的驱动版本进行安装。这一步需要提醒用户可能需要先更新软件源,或者检查是否有可用的专有驱动。


如果用户更倾向于使用命令行,那么需要指导他们如何通过命令行查询可用的驱动版本。常用的命令是`ubuntu-drivers devices`,这会列出推荐的驱动。然后使用`sudo apt install`来安装推荐的驱动,或者指定版本号安装。安装完成后需要重启系统,以确保驱动生效。


另外,有时候用户可能需要安装最新版的驱动,而Ubuntu官方仓库中的版本可能比较旧。这时候可以建议添加NVIDIA的官方PPA,比如graphics-drivers/ppa,然后更新并安装。但需要注意,使用PPA可能会有兼容性问题,特别是对于较新的显卡型号,可能需要最新的驱动支持。同时,添加PPA需要用户确认是否信任该源,属于常规操作。


在安装过程中,可能会遇到一些问题,比如安装后无法进入图形界面,这通常是因为驱动与当前的内核或系统组件不兼容。这时候需要引导用户进入恢复模式,卸载现有驱动,然后尝试安装其他版本。另外,Secure Boot的问题也需要考虑,如果系统启用了Secure Boot,安装第三方驱动时需要设置密码,否则可能导致驱动无法加载,进而无法进入系统。这时候需要指导用户在安装过程中处理Secure Boot的设置,或者暂时禁用Secure Boot


还有一个常见的问题是,安装NVIDIA驱动后,系统仍然使用开源驱动nouveau。为了避免冲突,安装前需要禁用nouveau驱动。通常可以通过在/etc/modprobe.d/blacklist.conf文件中添加黑名单条目,并更新initramfs。不过,在Ubuntu的某些版本中,使用官方仓库安装驱动时会自动处理这些步骤,但手动安装时可能需要用户自己处理。需要提醒用户检查是否成功禁用了nouveau,并确保在安装过程中没有冲突。


另外,安装完成后,用户可能需要验证驱动是否正常工作。可以使用`nvidia-smi`命令来检查显卡状态,或者通过系统设置中的关于部分查看图形接口是否切换为NVIDIA。如果遇到问题,可能需要查看Xorg的日志文件,或者使用`dmesg`命令检查内核日志,排查错误信息。


最后,需要提醒用户在安装驱动前,最好备份重要数据,以防万一出现系统无法启动的情况。同时,如果遇到无法解决的问题,建议查阅Ubuntu的官方文档或社区支持,比如Ask Ubuntu论坛,可能会有更多的解决方案。


总结一下,步骤大致如下:

1. 更新系统并检查可用的驱动版本。

2. 选择合适的驱动安装方法(图形界面或命令行)。

3. 处理Secure Boot和禁用nouveau驱动。

4. 安装驱动并重启系统。

5. 验证驱动是否正常工作,并处理可能的问题。


在解释每个步骤时,需要给出具体的命令示例,并说明可能需要的选项,比如安装推荐驱动时的自动选择,或者手动指定版本号。同时,对于可能出现的问题,提供解决方案或参考链接,帮助用户自行排查。


另外,需要注意不同版本的Ubuntu可能在软件包名称上有差异,例如nvidia-driver-535nvidia-driver-550等,需要根据用户的系统版本推荐正确的包名。如果用户不确定,可以建议使用ubuntu-drivers命令来检测推荐版本。


最后,确保语言简洁明了,避免使用过于专业的术语,让新手用户也能理解并跟随步骤操作。同时,提醒用户按照自己的显卡型号和系统需求选择合适的驱动版本,不必一味追求最新版,稳定性和兼容性更重要。


Ubuntu上安装NVIDIA显卡驱动的步骤如下,提供图形界面和命令行两种方法:

### **方法一:通过图形界面安装(推荐新手)**

1. **打开软件和更新”**

Ubuntu应用菜单中搜索并打开 **Software & Updates**(软件和更新)。

2. **选择专有驱动**

切换到 **Additional Drivers**(附加驱动)选项卡。

系统会自动检测可用驱动版本,选择带有 **“Proprietary, Tested”** 标识的推荐版本。

3. **应用更改**

点击 **Apply Changes**,输入密码后开始安装。

4. **重启系统**

安装完成后重启生效:`sudo reboot`

### **方法二:通过命令行安装(灵活推荐)**

#### **步骤1:更新系统并检查可用驱动**

“`bash

sudo apt update && sudo apt upgrade -y # 更新系统

ubuntu-drivers devices # 查看推荐驱动版本

“`

输出示例:

“`

driver : nvidia-driver-535 – third-party free

driver : nvidia-driver-550 – third-party free ***推荐***

“`

#### **步骤2:安装驱动**

– **安装推荐版本**

“`bash

sudo apt install nvidia-driver-550   # 替换为推荐版本号

“`

– **或自动安装推荐驱动**

“`bash

sudo ubuntu-drivers autoinstall

“`

#### **步骤3:处理Secure Boot(如有必要)**

如果系统启用了Secure Boot,安装过程中会提示设置密码,重启后需在蓝屏界面输入密码以载入驱动。

#### **步骤4:重启系统**

“`bash

sudo reboot

“`

### **验证安装**

– **检查显卡状态**

“`bash

nvidia-smi   # 显示GPU信息即表示成功

“`

– **查看驱动版本**

“`bash

nvidia-settings  # 或使用图形界面查看

“`

### **常见问题处理**

1. **黑屏/无法进入桌面**

重启进入恢复模式,选择 **root shell**,卸载驱动:

“`bash

sudo apt purge nvidia-*

sudo reboot

“`

重新尝试安装其他版本。

2. **禁用Nouveau开源驱动(通常自动处理)**

手动禁用(仅当冲突时):

“`bash

sudo nano /etc/modprobe.d/blacklist-nouveau.conf

“`

添加以下内容:

“`

blacklist nouveau

options nouveau modeset=0

“`

更新并重启:

“`bash

sudo update-initramfs -u

sudo reboot

“`

3. **安装最新版驱动(通过PPA**

“`bash

sudo add-apt-repository ppa:graphics-drivers/ppa

sudo apt update

ubuntu-drivers devices  # 查看最新版本

sudo apt install nvidia-driver-550  # 替换为目标版本

“`

### **总结**

– **推荐驱动**:优先使用`ubuntu-drivers devices`推荐的稳定版本。

– **Secure Boot**:启用时需设置密码,否则可能导致驱动无法加载。

– **验证工具**:使用`nvidia-smi`或系统设置确认驱动状态。

遇到问题可查阅 [Ubuntu官方文档](https://help.ubuntu.com/community/NvidiaDriversInstallation) 或社区论坛寻求帮助。

提问:用python生成一套pytorch多机多卡训练的代码

结论: 70B和671B生成的代码基本逻辑一致,都没有问题,相差也不大。

本地部署70B:

<think>

嗯,用户让我用Python生成一套PyTorch多机多卡训练的代码。首先,我得理解用户的需求。他们可能是在做一个分布式训练的项目,或者想提升训练速度,所以需要利用多台机器和多块GPU


我应该从基础开始,先考虑如何初始化分布式环境。PyTorchDistributedDataParallelDDP),所以我会用到torch.distributed包。接下来,设置环境变量,比如MASTER_ADDRMASTER_PORT,这些是必须的。然后,初始化进程组,使用init_process_group,这里选择gloo后端,因为它支持多种通信方式,适合多机环境。


接下来,数据的分布式加载是关键。使用DistributedSampler可以确保每个进程只处理一部分数据,避免重复。数据加载器需要用这个sampler,然后在每个进程中创建相同的模型,当然,这里我会用一个简单的卷积网络作为示例。


然后是包装模型为DDP模型,这样PyTorch会自动处理梯度同步等操作。在训练循环里,每个epoch开始前,设置samplerepoch,这样可以打乱数据。如果不设置,可能每个epoch的数据分配会一样,影响多样性。


优化器和损失函数的选择,这里用SGD和交叉熵损失比较常见。训练过程中,每个进程只处理自己的那部分数据,计算损失,然后反向传播,最后更新参数。


在评估的时候,可能需要在主进程上进行,避免其他进程干扰。使用torch.no_grad()可以加快评估速度,节省内存。


最后,确保训练结束后,所有进程都能正确销毁,避免资源泄漏。


我还得考虑代码的结构,如何让它清晰易懂。可能分成几个部分:导入库、初始化分布式环境、定义模型和数据加载、训练循环、评估,最后销毁进程组。


另外,用户可能需要在不同的机器上运行,所以需要确保每台机器上的代码一致,并且可以通过主机名或IP连接。可能需要提醒用户设置正确的MASTER_ADDR,并在各台机器上启动相应的进程数。


测试的时候,可能需要使用多个终端,分别运行不同角色(主进程和其他进程)。或者,用户可能使用slurm或其他集群管理工具来启动多个任务。


总结一下,我需要提供一个完整的代码示例,涵盖初始化、数据加载、模型定义、训练和评估,同时添加注释,解释每个部分的作用,帮助用户理解和调整代码。这样用户就能根据自己的需求,修改数据集、模型结构和训练参数了。


</think>

以下是使用 PyTorch 实现多机多卡训练的示例代码。这个代码使用了 PyTorch 的分布式训练功能(`torch.distributed`),支持多机多卡训练:


“`python

import os

import torch

import torch.distributed as dist

import torch.nn as nn

import torch.optim as optim

from torch.utils.data import DataLoader, DistributedSampler

import torchvision

import torchvision.transforms as transforms

# 设置随机种子

torch.manual_seed(42)

# 定义训练的模型

class Net(nn.Module):

def __init__(self):

super(Net, self).__init__()

self.conv1 = nn.Conv2d(1, 10, 5)

self.conv2 = nn.Conv2d(10, 20, 5)

self.conv2_drop = nn.Dropout2d()

self.fc1 = nn.Linear(320, 50)

self.fc2 = nn.Linear(50, 10)

def forward(self, x):

x = torch.relu(torch.max_pool2d(self.conv1(x), 2))

x = torch.relu(torch.max_pool2d(self.conv2_drop(self.conv2(x)), 2))

x = x.view(-1, 320)

x = torch.relu(self.fc1(x))

x = self.fc2(x)

return torch.log_softmax(x, dim=1)

def train(rank, world_size, model, device, dataloader, optimizer, criterion, epoch):

model.train()

for batch_idx, (data, target) in enumerate(dataloader):

data, target = data.to(device), target.to(device)

optimizer.zero_grad()

output = model(data)

loss = criterion(output, target)

loss.backward()

optimizer.step()

if batch_idx % 10 == 0:

print(f’Rank {rank}, Epoch [{epoch}/{10}], Batch [{batch_idx}/{len(dataloader)}], Loss: {loss.item():.4f}’)

def evaluate(model, device, dataloader, criterion):

model.eval()

total_loss = 0

correct = 0

with torch.no_grad():

for data, target in dataloader:

data, target = data.to(device), target.to(device)

output = model(data)

loss = criterion(output, target)

total_loss += loss.item()

_, predicted = torch.max(output, 1)

correct += (predicted == target).sum().item()

accuracy = correct / len(dataloader.dataset)

average_loss = total_loss / len(dataloader)

return average_loss, accuracy

def main():

import argparse

parser = argparse.ArgumentParser(description=’PyTorch MNIST Distributed Training’)

parser.add_argument(‘–rank’, type=int, default=0,

help=’rank of process’)

parser.add_argument(‘–world_size’, type=int, default=4,

help=’number of processes’)

parser.add_argument(‘–batch_size’, type=int, default=64,

help=’batch size’)

parser.add_argument(‘–epochs’, type=int, default=10,

help=’number of epochs’)

args = parser.parse_args()


# 初始化分布式环境

os.environ[‘MASTER_ADDR’] = ‘localhost’

os.environ[‘MASTER_PORT’] = ‘29500’

dist.init_process_group(‘gloo’, rank=args.rank, world_size=args.world_size)


# 设置设备

device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)


# 载入数据集

transform = transforms.Compose([transforms.ToTensor()])

train_dataset = torchvision.datasets.MNIST(root=’./data’, train=True, download=True, transform=transform)

test_dataset = torchvision.datasets.MNIST(root=’./data’, train=False, download=True, transform=transform)


# 创建分布式数据加载器

train_sampler = DistributedSampler(train_dataset, num_replicas=args.world_size, rank=args.rank)

test_sampler = DistributedSampler(test_dataset, num_replicas=args.world_size, rank=args.rank, shuffle=False)

train_loader = DataLoader(train_dataset, batch_size=args.batch_size, sampler=train_sampler, num_workers=2, drop_last=True)

test_loader = DataLoader(test_dataset, batch_size=args.batch_size, sampler=test_sampler, num_workers=2, drop_last=False)


# 初始化模型、优化器和损失函数

model = Net().to(device)

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

criterion = nn.NLLLoss()


# 包装模型为分布式模型

model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[device])

for epoch in range(args.epochs):

train_loader.sampler.set_epoch(epoch)

train(args.rank, args.world_size, model, device, train_loader, optimizer, criterion, epoch)

if args.rank == 0:

test_loss, test_acc = evaluate(model.module, device, test_loader, criterion)

print(f’Test Loss: {test_loss:.4f}, Accuracy: {test_acc:.2f}%’)

dist.destroy_process_group()

if __name__ == ‘__main__’:

main()

“`

### 使用说明

1. **参数设置**

– `–rank`: 进程的排名(0 world_size-1)。

– `–world_size’: 进程的总数量。

– `–batch_size’: 每个进程的批次大小。

– `–epochs’: 训练的轮数。


2. **运行多机多卡训练**

在每台机器上运行该脚本,确保每台机器的 `rank` `world_size` 参数正确。

例如,使用4台机器训练,每台机器上运行:

“`bash

python -m torch.distributed.launch –nproc_per_node=2 –nnodes=4 –node_rank=0 –master_addr=192.168.1.100 –master_port=29500 main.py –world_size=8

“`

(假设每台机器有2GPU,总共4台机器,8GPU


3. **注意事项**

确保所有机器之间可以通过网络互相通信。

确保所有机器安装了相同版本的PyTorch,并且支持分布式训练。

确保数据集路径一致,或者在不同的机器上共享数据集。


### 代码结构

1. **模型定义**:定义了一个简单的卷积神经网络(`Net`)。

2. **训练函数**:定义了训练函数,接受分布式训练的参数。

3. **评估函数**:定义了模型评估函数。

4. **主函数**:解析参数,初始化分布式环境,加载数据集,定义模型和优化器,开始训练。


### 其他说明

该代码使用了PyTorch`DistributedDataParallel`DDP)来实现多机多卡训练。

使用`DistributedSampler`来确保每个进程加载不同的数据子集。

使用`gloo`作为通信后端,适合多机多卡训练。

如果使用GPU,可以将`device`设置为`cuda`,否则使用`cpu`

通过以上代码,你可以轻松实现多机多卡训练。只需在每台机器上运行该脚本,并确保通信参数正确即可。

DeepSeek R1(671B)

嗯,用户让我用Python生成一套PyTorch多机多卡训练的代码。首先,我需要理解多机多卡训练的基本概念。多机多卡通常指的是分布式数据并行(DDP),PyTorch提供了torch.distributed模块来支持这一点。所以,我需要使用DDP来实现。


接下来,我得考虑用户的需求。他们可能希望有一个可以直接运行的示例代码,可能用于图像分类任务,比如ResNetCIFAR-10上训练。因此,我需要包含数据加载、模型定义、训练循环、分布式设置等部分。


然后,我需要确定代码的结构。通常,分布式训练需要初始化进程组,设置rankworld_size。主节点的地址和端口需要指定,所以用户可能需要修改这些参数。代码中应该包含参数解析,比如–nodes–gpus–nr等,这样用户可以根据自己的集群环境进行调整。


数据加载部分要注意使用DistributedSampler,确保每个进程读取不同的数据分片。数据集应该被正确划分,避免数据重复。DataLoader需要设置sampler参数,并且shuffle应该设为False,因为Sampler自己处理了数据的分发。


模型部分,需要用DistributedDataParallel包装模型,并且要设置device_idsoutput_device,这样每个GPU处理自己的数据。损失函数和优化器的定义和单机情况类似,但要注意模型参数是在DistributedDataParallel中的。


训练循环里,每个epoch前需要调用sampler.set_epoch(epoch),这样可以保证每个epoch的数据划分不同,增加随机性。打印损失和准确率的时候,可能需要使用torch.distributed.all_reduce来聚合各个进程的结果,然后只在主进程上输出。否则每个进程都会打印,导致信息重复。


还需要考虑模型保存,通常只在主进程(rank 0)保存检查点,避免多个进程同时写入文件导致冲突。


然后,进程启动的部分,用户可能需要使用torch.distributed.launch或者torchrun来启动脚本。在示例中给出运行命令,比如使用两台机器,每台四个GPU的情况,用户可以根据实际情况调整参数。


可能遇到的坑:端口冲突,需要确保主节点的地址和端口正确,并且防火墙设置允许通信。另外,确保所有机器上的代码和数据集路径一致,否则可能导致错误。Batch size的设置,每个GPU上的batch大小是总大小除以总的GPU数量,用户需要根据实际情况调整。


最后,测试代码是否能在多机多卡环境下正常运行,可能需要用户自己根据实际环境修改部分参数,比如主节点IP、数据集路径等。所以,在代码注释中需要提醒用户注意这些地方,确保他们正确配置。


以下是一个基于PyTorch的多机多卡分布式训练代码示例,使用`DistributedDataParallel`实现。代码包含数据加载、模型定义、训练循环和分布式设置:


“`python

import os

import argparse

import torch

import torch.nn as nn

import torch.distributed as dist

from torch.nn.parallel import DistributedDataParallel as DDP

from torch.utils.data import DataLoader, Dataset

from torch.utils.data.distributed import DistributedSampler

from torchvision import models, transforms


# 自定义数据集示例(替换为实际数据集)

class CustomDataset(Dataset):

def __init__(self, data_size=1000):

self.data = torch.randn(data_size, 3, 224, 224)

self.labels = torch.randint(0, 1000, (data_size,))

def __len__(self):

return len(self.data)

def __getitem__(self, idx):

return self.data[idx], self.labels[idx]

def main():


# 参数解析

parser = argparse.ArgumentParser()

parser.add_argument(“–nodes”, type=int, default=1, help=”节点数量“)

parser.add_argument(“–gpus”, type=int, default=1, help=”每个节点的GPU数量“)

parser.add_argument(“–nr”, type=int, default=0, help=”当前节点排名“)

parser.add_argument(“–epochs”, type=int, default=10)

parser.add_argument(“–batch_size”, type=int, default=32)

parser.add_argument(“–master_addr”, default=”localhost”, help=”主节点地址“)

parser.add_argument(“–master_port”, default=”12355″, help=”主节点端口“)

args = parser.parse_args()


# 分布式设置

world_size = args.nodes * args.gpus

os.environ[“MASTER_ADDR”] = args.master_addr

os.environ[“MASTER_PORT”] = args.master_port

local_rank = int(os.environ.get(“LOCAL_RANK”, 0))

rank = args.nr * args.gpus + local_rank


# 初始化进程组

dist.init_process_group(

backend=”nccl”,

init_method=”env://”,

world_size=world_size,

rank=rank

)


# 设置GPU设备

torch.cuda.set_device(local_rank)

device = torch.device(“cuda”, local_rank)


# 创建模型

model = models.resnet50(num_classes=1000)

model = model.to(device)

model = DDP(model, device_ids=[local_rank], output_device=local_rank)


# 数据加载

transform = transforms.Compose([

transforms.ToTensor(),

transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

])

dataset = CustomDataset()

sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)

dataloader = DataLoader(

dataset,

batch_size=args.batch_size,

sampler=sampler,

num_workers=4,

pin_memory=True

)


# 定义损失函数和优化器

criterion = nn.CrossEntropyLoss().to(device)

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)


# 训练循环

for epoch in range(args.epochs):

sampler.set_epoch(epoch)  # 设置epoch保证shuffle正确性

model.train()

for i, (inputs, labels) in enumerate(dataloader):

inputs = inputs.to(device, non_blocking=True)

labels = labels.to(device, non_blocking=True)

outputs = model(inputs)

loss = criterion(outputs, labels)

optimizer.zero_grad()

loss.backward()

optimizer.step()


# 打印训练信息(只在rank 0打印)

if rank == 0 and i % 10 == 0:

print(f”Epoch [{epoch+1}/{args.epochs}], Step [{i}/{len(dataloader)}], Loss: {loss.item():.4f}”)


# 保存模型(只在rank 0保存)

if rank == 0:

torch.save(model.module.state_dict(), f”model_epoch_{epoch}.pth”)


# 清理进程组

dist.destroy_process_group()

if __name__ == “__main__”:

main()

“`

**启动训练的命令**

“`bash

# 在每台机器上执行(假设有2台机器,每台4GPU

# 第一台机器(nr=0):

torchrun –nnodes=2 –nproc_per_node=4 –node_rank=0 –master_addr=<MASTER_IP> –master_port=12355 train.py

# 第二台机器(nr=1):

torchrun –nnodes=2 –nproc_per_node=4 –node_rank=1 –master_addr=<MASTER_IP> –master_port=12355 train.py

“`

**关键组件说明**

1. **分布式初始化**:使用NCCL后端和env://初始化方法

2. **数据并行**:使用`DistributedSampler`保证数据分片

3. **模型并行**:使用`DistributedDataParallel`包装模型

4. **进程通信**:自动处理梯度同步和参数更新

5. **资源管理**:通过LOCAL_RANK自动分配GPU设备


**注意事项**

1. 需要所有节点保持相同代码和依赖环境

2. 确保网络互通且防火墙开放指定端口

3. 主节点需要固定IP地址(替换<MASTER_IP>

4. 实际使用需修改数据集和模型结构

5. 建议使用共享存储或定期同步模型参数

6. 监控GPU使用情况(nvidia-smi)和网络带宽

可以根据具体需求调整模型结构、数据加载方式、优化器参数和训练策略。多机训练时需要注意网络延迟和带宽限制,建议使用高性能网络连接(如InfiniBand)。

提问:介绍哪吒之魔童闹海这部电影

结论: 联网搜索可以获取到最新的讯息使得模型对于实时问题的回答更加准确,70B和671B的模型回答信息略有不同,但都没有事实错误。而70B不联网就会出现对一些实时新闻和知识的缺失并出现错误回答。

本地部署70B:

<think>

嗯,我现在想介绍一下《哪吒之魔童闹海》这部电影。虽然我对这部电影不是很了解,但我会尽力回忆和查找相关信息,然后组织成一个有条理的介绍。


首先,我应该了解这部电影的基本信息,比如导演是谁,什么时候上映的,制作公司是哪家,还有电影的类型。这些基本信息能帮助读者快速了解电影的背景。


接下来,剧情简介是关键部分。我需要概述电影的主要故事,包括哪吒的身份、他的背景,以及他在故事中的冒险和挑战。比如,哪吒是李靖和袁氏的孩子,被贬下凡,如何闹海等等。


然后,角色部分也很重要。除了哪吒,还有李靖、袁氏、龙王、龙王女等主要角色,他们各自的特点和在故事中的作用需要简单介绍。


接下来,我应该谈谈电影的艺术表现,包括画面、音乐、动画技术等方面。比如,这部电影的画面很精美,色彩丰富,动画技术成熟,音乐也很出色,能增强观影体验。


此外,票房和口碑也是重要的信息。我需要查一下这部电影的票房情况,以及观众和媒体的评价,特别是它在国际上的表现,比如是否获得了奖项或者进入国际电影节。


最后,总结一下这部电影的意义和影响,为什么它在中国动画电影史上具有里程碑的意义,以及它对后续动画产业的影响。


在整理这些信息时,我要确保内容准确无误,如果不确定的地方,可能需要查阅可靠的资料来验证。同时,语言要通俗易懂,避免太过专业的术语,让更多的读者能够理解和感兴趣。


现在,我开始逐步整理这些部分,确保每个部分都涵盖必要的信息,并且逻辑清晰,结构合理。


</think>

**《哪吒之魔童闹海》电影介绍**

**导演与制作** 

《哪吒之魔童闹海》由 Yu Yang 执导,于 2019 7 13 日在中国内地上映。该片由光线影业和北京筝弦文化传媒有限公司联合出品,是一部动画奇幻冒险电影。


**剧情简介** 

电影讲述了神话人物哪吒的成长故事。哪吒是李靖与蛇精袁氏的孩子,因天庭诸神对其身份的偏见,他被贬下凡间。在成长过程中,哪吒展现出非凡的能力,但也遭受歧视和误解。为了证明自己的清白,哪吒踏上了闹海的冒险旅程,挑战东海龙王,旨在洗刷冤屈并寻找自我认同。


**主要角色** 

– **哪吒**:主角,拥有神勇与智慧,但性格孤傲,渴望证明自我。 

– **李靖**:哪吒之父,原为天庭将领,因爱情坠入凡尘,成为普通百姓。 

– **袁氏**:哪吒之母,蛇精之女,善良坚韧。 

– **东海龙王**:掌管东海龙宫,实力强大,威严凶猛。 

– **龙王女**:龙王之女,美丽而温柔,对哪吒产生好感。


**艺术表现** 

电影以华丽的画面和细腻的情感描写见长,色彩鲜明,场景设计精美。动画技术成熟,人物刻画独具特色,音乐与情节完美契合,增强了观影体验。


**票房与口碑** 

《哪吒之魔童闹海》取得了显著的票房成功,在中国内地票房超过 11 亿元人民币,成为当年的票房黑马。影片在国际上也获得了广泛关注,入围第 92 届奥斯卡金像奖动画长片短名单,并在多个国际电影节上获得奖项。


**总结** 

《哪吒之魔童闹海》以其精彩的剧情、精湛的艺术表现和深刻的情感内核,成为中国动画电影史上的里程碑之作。它不仅推动了国产动漫的发展,也在国际上提升了中国动画的影响力。影片通过哪吒的故事,传递了勇于面对困境、追求自我价值的正能量主题,值得一看。

本地部署70B(联网):

<think>

好的,用户让我介绍一下《哪吒之魔童闹海》这部电影。我首先得看看我有什么已有的信息。


从搜索结果来看,有两条信息。第一条看起来是百度直播的结果,可能不相关,暂时可以忽略。第二条来自百度百科,详细介绍了这部电影的基本信息。


电影的中文名是《哪吒之魔童闹海》,简称《哪吒2》。制作方有可可豆动画和光线彩条屋影业,饺子担任编剧兼导演,主要配音演员包括吕艳婷、囧森瑟夫等。上映时间是2025129日在中国大陆,214日在北美。内容方面,电影延续第一部的故事,讲述天劫后的哪吒和敖丙如何挣扎求生,揭示更多关于龙宫和混沌之力的秘密,并深入挖掘他们的情感纠葛。


了解这些,我可以组织一个有结构的介绍,包括影片的基本信息和剧情梗概,帮助用户快速了解这部电影的主要内容和亮点。


</think>

《哪吒之魔童闹海》(简称《哪吒2》)是一部由可可豆动画和光线彩条屋影业联合出品的动画电影,饺子担任编剧兼导演。主要配音演员包括吕艳婷、囧森瑟夫、瀚墨、陈浩和绿绮。该片于2025129日在中国大陆上映,214日在北美院线全面上映。这是《哪吒》系列电影的第二部,讲述了天劫之后,哪吒和敖丙的灵魂保住,但面临新的危机。影片延续了第一部的奇幻故事,并深入揭示了更多关于龙宫和混沌之力的秘密,同时展现了角色的情感纠葛与成长。

DeepSeek R1(671B)(联网):

《哪吒之魔童闹海》是国产动画电影《哪吒之魔童降世》的续作,由导演饺子(杨宇)执导并担任编剧,于2025129日在中国大陆正式上映。影片延续前作世界观,聚焦天劫后哪吒与敖丙的灵魂危机:两人虽保住元神,但肉身濒临消散。太乙真人以七色宝莲为媒介重塑其躯体的过程中,遭遇未知阻挠,两位主角的命运由此面临重大转折。


该片时长144分钟,融合奇幻、喜剧、动画与剧情元素,由吕艳婷、囧森瑟夫、瀚墨等原班配音阵容回归演绎核心角色。影片凭借精良制作与深刻情感内核,上映后票房表现强劲,截至2025212日累计票房已突破92亿元,刷新国产动画电影票房纪录。此前,该片曾获2024年微博之夜最受期待春节档电影奖项,市场关注度与观众期待值在映前即持续攀升。

3. 代码辅助

借助Cline,我们可以向deepseek模型提问并直接生成本地可运行代码文件。

4. 文档辅助

目前借助OfficeAI插件可以直接在WPS中调用本地大模型,且具备排版、校对、润色、文案生成等现成功能,模型生成结果也可以一键导入左侧文档。

5. 本地知识库

利用Cherry Studio可以结合大模型和嵌入模型进行本地知识库的创建。

五、benchmark测试

1. 指标解读

TTFT (time to the first token, 首次生成token所需时间):该指标表示的是第一个 token 生成时间,也即 prefill 阶段的总耗时。

TPOT(Time per Output Token, 每个token输出的平均时长):该指标反映的是 decode 阶段输出每个 token 的时间,它衡量的是模型生成 token 的整体速度,不考虑 token 生成的顺序。

ITL (inter-token latency):该指标反映的是 decode 阶段 token 连续输出的耗时,它专注于衡量模型生成 token 的流式特性,即一个 token 生成后,下一个 Token 生成前的等待时间。

Throughput(每秒生成的token数):(the number of tokens to be generated) / Latency;

2. 测试环境

硬件环境

硬件方案1(单机*8卡):
GPU: 8x NVIDIA Tesla V100 32GB
CPU: Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz
内存: 512GB

硬件方案2(3机*8卡):
GPU:8x NVIDIA GeForce RTX 2080 Ti
CPU:Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
内存:376G

软件环境

vLLM版本: 0.7.2
CUDA: 11.8
Python: 3.11

测试数据集:ShareGPT_V3_unfiltered_cleaned_split.json
提问总数:100
RPS:1、5、10、20、50、100
TTFT、TPOT、ITL取平均值。
Throughput取输出token。

3. 测试命令

服务端:

vllm serve ~/DeepSeek/DeepSeek-R1-Distill-Llama-70B --tensor-parallel-size 8  
--max-model-len 24576 --trust-remote-code --enforce_eager --dtype=half --host 0.0.0.0 --port 
11435 --served_model_name DeepSeek-R1-Distill-Llama-70B

客户端:

python benchmarks/benchmark_serving.py --backend openai-chat --model
/home/ubuntu/DeepSeek/DeepSeek-R1-Distill-Llama-70B --served-model-name DeepSeek-R1-Distill-Llama-70B --dataset
/home/ubuntu/dataset/LLM/ShareGPT_V3_unfiltered_cleaned_split.json --dataset-name sharegpt --request-rate 10 --trust-remote-code --num-prompts 100 --host <服务器IP> --port 11435 --result-dir /home/ubuntu/vllm-v0.7.2/res --endpoint /v1/chat/completions

4. 测试结果

1) TTFT

2) TPOT

3) ITL

4) Throughput

结论

  1. 随着并发请求数(RPS)增加,TTFT会显著增加,意味着用户等待回答的时间增加;
  2. RPS的增加对TPOT、ITL和Throughput影响不大;
  3. 单机部署的TPOT和ITL均显著小于多机部署,吞吐量Throughput则大于多机部署,说明多机部署存在的通信瓶颈会显著影响吞吐量等使用体验;

参考文献:

  1. https://huggingface.co/deepseek-ai/DeepSeek-V3#6-how-to-run-locally
  2. https://github.com/vllm-project/vllm
  3. https://docs.vllm.ai/en/latest/index.html

(文:极市干货)

欢迎分享

发表评论