DeepSeek-单机多卡折腾记

1.DeepSeek部署-Win版本

2.DeepSeek部署-Linux版本

3.DeepSeek部署-一键部署(Linux版本)

4.DeepSeek部署-进阶版本(Linux+GPU)

5.DeepSeek部署-基于vLLM部署

6.DeepSeek部署-部署Open WebUI

7.DeepSeek部署-容器化(Docker)部署vLLM和Open WebUI

8.DeeSeek部署-多机多卡集群部署

前面我们从单机到集群,从Win到Linux都已经涉及,但是没涉及到单机多卡,本篇文章就来说说这个单机多卡遇到的问题。

本次环境是4张卡Tesla V100卡。

1.只能用1张卡

ollama是使用官方脚本安装的,ollama是以systemctl方式启动,下载的是deepseek-r1:32b模型,启动以后发现只使用了22G显存,实际上只用了1张卡,其他卡未使用。

图片

如果要使用4张卡则需要按照下面的方式调整配置,或者跑更大的模型,如果超过单张卡GPU显存限制,则会自动分配到所有显卡上面,不需要做任何特殊配置。

vi /etc/systemd/system/ollama.service
#增加下面2个参数
Environment="CUDA_VISIBLE_DEVICES=0,1,2,3"
Environment="OLLAMA_SCHED_SPREAD=1"
#重新加载ollama
systemctl daemon-reload
systemctl restart ollama
#然后重启模型
ollama run deepseek-r1:32b

图片

2.模型自动退出

模型启动以后,如果自动退出(默认时间是5分钟),但是你提问的时候他会自动拉起(中途需要反应时间),这样会降低响应速度。​​​​​​​

#日志里面大概会有类似的日志
"new model will fit in available VRAM, loading" model=/usr/share/ollama/.ollama/models/blobs/sha256-4cd576d9aa16961244012223abf01445567b061f1814b57dfef699e4cf8df339 library=cuda parallel=4 required="49.9 GiB"
#设置-1则永不退出,也可以设置其他具体时间,比如1h。
#再参考刚才 重启服务即可常驻
Environment="OLLAMA_KEEP_ALIVE=-1"

​​​​​​​

3.单机运行多模型

机器下载了多个模型,运行其中一个模型以后,再开启另外一个模型。​​​​​​​

root@localhost:~# ollama ls
NAME                                 ID              SIZE     MODIFIED     
deepseek-r1:32b                      38056bbcbb2d    19 GB    3 hours ago     
deepseek-r1:32b-qwen-distill-fp16    141ef25faf00    65 GB    19 hours ago    
deepseek-r1:70b                      0c1615a8ca32    42 GB    20 hours ago  

图片

4.Open WebUI 提问拉起模型

部署ollama以后,他会自动开机启动;再部署好容器化的Open WebUI(也配置了开机自启动)。这个时候我们把这个机器重启(模型未启动),我们可以通过Open WebUI访问到模型并进行提问,这个时候模型就会自动启动,然后等待模型启动以后,他就会自动回答我的问题(需要等待模型启动的时间)。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

### 配置DeepSeek-V2的GPU设置 为了使DeepSeek-V2能够在个GPU上运行,通常会采用PyTorch内置的支持工具来实现这一点。下面是一个具体的例子说明如何配置: ```python import torch from deepseek_model import DeepSeekModel def setup_multi_gpu(model, device_ids=None): """ 设置模型以支持GPU并行计算。 参数: model (torch.nn.Module): 要分配到个GPU上的神经网络模型实例。 device_ids (list of int or NoneType): GPU设备ID列表;如果为None,则默认使用所有可用的GPU。 返回值: torch.nn.DataParallel 或者 原始model对象: 如果有超过一个GPU被指定或检测到,则返回包裹好的DataParallel模块; 否则直接返回原始model对象。 """ if not isinstance(device_ids, list) and torch.cuda.device_count() > 1: print(f"Using {torch.cuda.device_count()} GPUs!") return torch.nn.DataParallel(model) elif isinstance(device_ids, list) and len(device_ids) >= 2: print(f"Using specified GPUs with IDs: {device_ids}") return torch.nn.DataParallel(model, device_ids=device_ids) else: print("Only one GPU detected/selected.") return model # 创建模型实例 model = DeepSeekModel() # 将模型转换成适合GPU的形式 multi_gpu_model = setup_multi_gpu(model=model) # 加载预训练权重 state_dict = torch.load('deepseek_model.pth') multi_gpu_model.module.load_state_dict(state_dict) if hasattr(multi_gpu_model,'module') else multi_gpu_model.load_state_dict(state_dict) # 切换至评估模式 multi_gpu_model.eval() ``` 这段代码展示了怎样通过`torch.nn.DataParallel`类让DeepSeek-V2能够利用个图形处理器加速运算过程[^2]。当存在两个以上的GPU时,程序会选择所有的可见GPU来进行分布式处理;也可以手动指定想要使用的特定GPU集合。需要注意的是,在保存和加载状态字典的时候要考虑到是否使用了`DataParallel`封装器的影响[^1]。 #### 注意事项 - **内存管理**:随着参与工作的GPU数量增加,每张上面所承载的数据量可能会减少,但是总的显存消耗依然很高。因此建议监控系统的资源占用情况,并适当调整批量大小(batch size),以免超出硬件的能力范围。 - **同步机制**:在某些情况下可能需要引入额外的参数更新策略(比如梯度累积),因为不同步可能导致各节点间的学习率差异过大影响最终效果。 - **性能优化**:尽管GPU确实能带来速度上的优势,但在实际部署过程中还需要考虑诸如通信开销等因素对整体效率造成的影响。可以通过实验测试找到最适合当前环境的最佳实践方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值