用DeepSeek给GPU服务器做压力测试
搞GPU服务器运维和AI基础设施的人,迟早会遇到一个问题:新到手的机器,或者刚装好驱动的旧机器,怎么确定它的算力真正能跑、稳定能扛?常规做法是跑一遍gpu-burn,看看显卡会不会掉驱动、温度会不会爆炸,但gpu-burn只能测“计算芯片本身的稳定性”,测不出你真正要推理的负载——大模型。我最近就把DeepSeek模型拉上服务器,做了一整套压测方案,效果比单纯烧卡好太多。这篇文章把我完整的压测思路、环境搭建、脚本参数和踩坑记录都写出来,给同样在折腾GPU服务器的人一个参考。
这套方法适合谁?适合手里有单卡、多卡服务器,或者准备租GPU跑大模型推理的人。不管是刚装好CUDA的开发机,还是准备上线推理服务的生产机器,都可以用它来验证性能、稳定性、散热和供电。文章里的命令和脚本我尽量写得直接一点,保证你在自己的机器上也能照着跑。
1. 为什么用DeepSeek来做GPU压力测试
1.1 GPU压力测试到底在测什么
很多刚接触服务器的人以为压力测试就是把显卡跑满,跑个FurMark或者gpu-burn就完事了。实际上,对于一台要做大模型推理的服务器来说,压测的核心不是“让GPU计算单元跑满”,而是模拟真实负载,看整条链路的“极限”和“短板”。
真实的大模型推理请求不是一个简单的、固定的计算任务,它包含几个环节:前端API接收请求、tokenize把文本切分成token序列、prefill阶段计算大矩阵、decode阶段逐个生成token、多卡之间做集合通信来同步模型参数和中间结果、最后再拆bucket返回结果。每一个环节都可能成为瓶颈。GPU利用率只是表面现象,更重要的是:
- 显存占用是否稳定,会不会随着请求堆积而持续上涨;
- prefill和decode的吞吐量能到多少,单并发和多并发下的差异有多大;
- 首token延迟是否在可接受范围内,长文本请求会不会让服务卡死;
- 多卡并行时NVLink或PCIe的通信是否成为瓶颈;
- 长时间高负载下温度、功耗、风扇转速是否在安全范围;
- 掉驱动、ECC错误、PCIe链路降速等硬故障是否出现。
所以压测有一个核心思路:不仅要让显卡“有活干”,还要让整台服务器的软件栈和硬件链路都处于真实的工作状态。用大模型推理来压测,正好能把上面所有环节覆盖到。这比单纯用gpu-burn烧显存死循环要贴合实际得多。
1.2 为什么选DeepSeek而不是随便拿个模型跑
选DeepSeek有几个很实在的理由。首先,DeepSeek是目前开源社区非常活跃的模型,权重下载方便,从几B的小模型到几百B的大模型都有,适配不同显存规模的服务器。其次,它的架构和主流LLM一致,用Transformer加MoE(混合专家)的设计,对显存带宽、计算能力、集合通信的要求都很典型,用它跑出来的压测结果有代表性。再次,DeepSeek系列模型在Hugging Face上的权重格式完整,兼容vLLM、SGLang这些主流推理框架,部署起来不难。
更重要的一点是,DeepSeek模型能模拟一个真实的业务负载。比如7B级别的模型在单卡上就能跑,可以压测单卡;32B、671B(MoE)的模型则适合压测多卡并行环境。你甚至可以用不同尺寸的模型,判断一台服务器的“最佳适配模型档位”。比如一台A100 80G的服务器,跑7B模型可能GPU利用率只有三成,但跑70B模型就能把算力打满。压测的意义就在于帮你找到这台机器的最优定位。
另外,我还配合了DeepSeek官方开源的一套评估/压测harness工具,它支持加载DeepSeek系列模型并模拟真实的文本生成任务,能控制并发数、请求长度等参数。这样压测不是简单的“给GPU丢一堆矩阵乘法”,而是像真正的业务那样发送prompt、生成回答,得到非常有参考价值的性能数据。
1.3 一套靠谱的压测流程需要覆盖哪些指标
压测不是跑一个工具看个数字就完了。我在给服务器做压测时,至少会记录以下几类数据:
| 指标类别 | 具体指标 | 说明 |
|---|---|---|
| 计算性能 | GPU利用率、SM占用率、显存带宽 | 反映GPU算力是否被有效利用 |
| 推理性能 | 首token延迟、平均生成速度、吞吐量(TPS) | 反映用户实际体验和系统承载能力 |
| 稳定性 | 长时间运行的错误率、请求失败率、是否掉卡 | 反映系统是否可连续工作 |
| 资源消耗 | 显存占用、CPU占用、内存占用、网络吞吐 | 反映是否有多余资源或潜在瓶颈 |
| 散热与供电 | GPU温度、热点温度、功耗、风扇转速 | 反映散热设计是否合理,供电是否稳定 |
刚开始压测的新手很容易只看GPU利用率。比如看到90%就觉得没问题,但有可能prefill阶段很高、decode阶段很低,整体吞吐并不理想。所以记录指标时,最好把压测过程分成两阶段看待:prefill(输入处理)和decode(逐字生成)。大模型的很多性能问题,恰恰出在这两个阶段的切换和资源分配上。
2. 动手前先搞定环境:驱动、CUDA、PyTorch和模型准备
2.1 先确认服务器硬件与驱动底子
拿到一台GPU服务器,第一步不是急着装东西,而是先做一次体检。我会先查看系统识别到的显卡:
nvidia-smi这里要看的包括驱动版本、CUDA版本、显存大小、当前温度。如果显卡没有出现在列表里,先检查PCIe插槽和供电线。如果是新装驱动的机器,可以再用nvidia-smi --query-gpu=name,driver_version,memory.total --format=csv输出更完整的信息。
接下来检查系统是否识别到了所有卡:
lspci | grep -i nvidia如果卡的个数不对,大概率是电源功率不足、PCIe插槽接触不良,或者需要检查BIOS里的PCIe拆分设置。
对于多卡服务器,还要确认卡之间的通信方式。H100、A100这类卡用NVLink互联,通信带宽远高于PCIe。用nvidia-smi topo -m可以查看卡间的拓扑结构。压测前确认NVLink能正常工作很重要,因为很多MoE模型的多卡并行,卡间通信量大得惊人。
驱动版本和CUDA版本也顺手记录一下,这两个版本最好保持一个稳定组合。我自己的一个习惯是:在驱动和CUDA上不做“最新”,只做“稳定”。生产服务器尤其如此。
2.2 安装PyTorch GPU版,建议直接用虚拟环境
大模型推理框架(vLLM等)依赖PyTorch,所以压测前得装好GPU版的PyTorch。这一步看起来简单,实际上最容易出问题的地方就是“装了CPU版”。很多人跑起来发现GPU根本没用,愣是想不明白。
判断当前PyTorch是不是GPU版,很简单:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"如果是GPU版,torch.cuda.is_available()会返回True。如果是False,大概率装了CPU版,或者驱动和CUDA的匹配有问题。
我建议用conda创建一个干净的环境,避免污染系统自带的Python。以CUDA 12.1为例(版本号可以根据NVIDIA驱动支持的最高CUDA版本调整):
conda create -n gpu-stress python=3.10 -y conda activate gpu-stress pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121如果网速一般,可以提前把wheel包下载好再传上去。装完之后务必跑一下上面的检测命令,确认GPU可用再继续。这一步卡住的概率最高,多花一分钟验证,能避免后面压测时白跑一场。
2.3 DeepSeek模型怎么拉取和存放
模型下载,我用的是Hugging Face的huggingface-cli工具。先安装:
pip install -U huggingface_hub huggingface-cli login登录之后,用一个合适的模型来压测。比如单卡A100 80G,我选deepseek-ai/DeepSeek-R1-Distill-Qwen-14B或者deepseek-ai/deepseek-llm-7b-chat,前者14B模型用fp16大概占28G显存,跑起来正好有一定的计算压力;后者7B模型占14G左右,适合快速验证。如果是多卡机器,可以选更大的模型,比如通过vLLM的tensor parallel加载32B甚至70B级别。
下载模型时,预先创建一个目录统一存放:
mkdir -p /data/models huggingface-cli download deepseek-ai/deepseek-llm-7b-chat --local-dir /data/models/deepseek-llm-7b-chat下载完成之后,检查目录里是否包含safetensors权重文件、tokenizer.json、config.json。缺少任何一个文件,后面加载就会报错。
有一点要特别注意:如果模型文件特别大(比如70B模型有一百多个G),下载和存储都要提前规划好磁盘空间。QQ服务器上经常碰到/data分区只有200G的小盘,下载到一半才意识到空间不足,折腾半天。下载前先df -h看一眼。
2.4 压测工具选型:DeepSeek-Harness、vLLM和gpu-burn
压测工具不在多,而在配合。我实际用的是“三件套”:
- gpu-burn:先做纯算力层的稳定测试,跑十几分钟看有没有掉驱动和ECC错误;
- vLLM + DeepSeek模型:启动真实的推理服务,模拟业务请求;
- DeepSeek-Harness:用来生成压力负载和控制并发,记录吞吐、延迟、失败率等指标。
gpu-burn在很多装机教程里都有,小巧实用。它在GitHub上有源码,安装也不复杂:
git clone https://github.com/wilicc/gpu-burn cd gpu-burn make编译完会生成gpu_burn可执行文件,后面直接跑就行。
vLLM更直接,它自带了一个OpenAI兼容的API服务,也自带简单的性能测试脚本。单卡或多卡都能支持:
pip install vllmDeepSeek-Harness我理解是一个针对DeepSeek模型做系统级评估和压测的harness工具,它把请求生成、统计指标这些事情做成了可配置的任务。用它可以模拟不同并发、不同输入输出长度的请求序列,相当于一个专门为DeepSeek定制的压测驱动器。如果你觉得这个harness的配置较复杂,用Python自己写一个并发脚本也能达到类似效果,我后面会给出一个可以直接用的版本。
3. 实操过程:从单卡烧机到多卡并发压测
3.1 第一步:用gpu-burn跑一遍纯算力烧机
我习惯先把纯硬件问题暴露出来,再上复杂负载。在这个阶段跑的gpu-burn,相当于给显卡做一次“高强度体检”。它的原理是通过CUDA的通用矩阵乘(GEMM)运算让GPU持续满负载运转,如果显卡的供电、散热或显存有问题,很容易在这十几分钟内暴露。
我给你一个实测过的跑法:
./gpu_burn 600这个命令会让所有可见GPU持续工作600秒。跑的过程中,开另一个终端用nvidia-smi dmon -s pucm每分钟记录一次温度、功耗、显存利用率和SM利用率。如果中间出现显卡掉线(进程崩溃、返回非零)或者温度直接撞到90度以上,后面的压测就别做了,先解决硬件问题。
gpu-burn跑完之后,我会从几个维度判断结果:
- 显卡是否在满负载下保持稳定,期间有没有出现ECC错误;
- 温度曲线是平坦的还是持续爬坡的。持续爬坡说明散热没压住,或者机箱风道有问题;
- 功耗是否达到显卡额定功耗。比如A100标称400W,如果gpu-burn时最高功耗只有200W,多半是供电降速或者驱动限流了。
这一步不是走个过场,很多二手服务器的隐性故障就是在这里被发现的。
3.2 第二步:启动DeepSeek推理服务
硬件稳了之后,开始加载DeepSeek模型。我用vLLM启动,因为它对显存管理做得好,支持Continuous Batching(动态拼接请求),在处理并发请求时吞吐量明显优于原生transformers。
以单卡4张A100 80G、加载14B模型为例,启动命令大致是:
python -m vllm.entrypoints.openai.api_server \ --model /data/models/deepseek-llm-7b-chat \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.90 \ --max-model-len 4096 \ --port 8000参数含义很直白:模型路径指定本地目录,tensor-parallel-size表示用几张卡并行推理,gpu-memory-utilization让vLLM最多使用90%的显存(留一部分给推理过程中的KV cache),max-model-len限制了最长上下文长度,port指定API端口。
启动成功后,会有类似“Uvicorn running on http://0.0.0.0:8000”的日志。此时先用一个简单的请求确认服务正常:
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "/data/models/deepseek-llm-7b-chat", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 50}'能返回一段正常文本,说明推理链路已经通了。这个阶段我不会急着压满,而是先观察显存占用是否在预期范围。7B fp16的权重大约14G,加上KV cache等信息,在80G显存的卡上,vLLM的驻留显存大约在20G左右,剩下的会按需分配。这个观察对上规模压测时的显存预判很有帮助。
3.3 第三步:编写压测脚本,用并发请求打满服务
服务稳定后,开始上真正的压力。我自己写了一个Python压测脚本,借助concurrent.futures线程池模拟并发用户,批量发送请求并记录耗时。脚本不长,但足够日常压测使用。
import json import time import threading import requests from concurrent.futures import ThreadPoolExecutor API_URL = "http://localhost:8000/v1/chat/completions" MODEL = "/data/models/deepseek-llm-7b-chat" TOTAL_REQUESTS = 200 CONCURRENCY = 16 MAX_TOKENS = 256 results = [] lock = threading.Lock() failures = 0 def send_request(idx): global failures prompt = f"这是第{idx}个压测请求,请写一段约150字的技术说明文本。" payload = { "model": MODEL, "messages": [{"role": "user", "content": prompt}], "max_tokens": MAX_TOKENS, "temperature": 0.7, } start = time.time() try: resp = requests.post(API_URL, json=payload, timeout=180) elapsed = time.time() - start data = resp.json() prompt_tokens = data.get("usage", {}).get("prompt_tokens", 0) completion_tokens = data.get("usage", {}).get("completion_tokens", 0) with lock: results.append({ "elapsed": elapsed, "completion_tokens": completion_tokens, "prompt_tokens": prompt_tokens, }) except Exception as e: with lock: failures += 1 print(f"请求{idx}失败: {e}") with ThreadPoolExecutor(max_workers=CONCURRENCY) as executor: futures = [executor.submit(send_request, i) for i in range(TOTAL_REQUESTS)] for f in futures: f.result() total_tokens = sum(r["completion_tokens"] for r in results) total_time = sum(r["elapsed"] for r in results) throughput = total_tokens / total_time if total_time else 0 print(f"成功请求数: {len(results)}") print(f"失败请求数: {failures}") print(f"平均响应时间: {sum(r['elapsed'] for r in results) / len(results):.2f}s") print(f"总生成token数: {total_tokens}") print(f"端到端吞吐: {throughput:.2f} token/s")这个脚本有几个设计细节值得说。一是CONCURRENCY用16,针对7B模型在A100上算是中等负载,会先把显存和SM跑起来,又不至于一开始就把服务打挂。二是timeout=180,模型生成256个token时,在低并发下通常十几秒能完成,设置一个宽松上限是为了避免网络层误判。三是记录prompt_tokens和completion_tokens,这两项在后面分析prefill和decode阶段性能时非常关键。
压测可以分几组跑:并发数从1、4、16、32递增,每组固定200个请求。这样能看到一个清晰的吞吐量曲线。我实测的感受是,并发从1涨到16时,吞吐量增幅明显;再往上,如果显存足够但GPU利用率已经打满,吞吐量增长就趋于平缓甚至下降,这是一个非常典型的“拐点”,也就是这台服务器在该模型下的最佳并发窗口。
3.4 第四步:边压测边监控,别让GPU悄悄烧坏
压测过程中最怕的不是服务崩,而是硬件损坏。所以我建议至少开两个终端:一个跑压测脚本,另一个用监控工具实时盯GPU状态。
watch -n 1 nvidia-sminvidia-smi基本够用,能显示每张卡的利用率、显存、温度和功耗。更细致一点,可以用nvidia-smi的查询模式,把关键指标落成日志,方便压测结束后画曲线:
nvidia-smi --query-gpu=timestamp,index,utilization.gpu,utilization.memory,temperature.gpu,power.draw --format=csv -l 1 > /tmp/gpu_metrics.csv这个命令每秒记录一次,压测跑多久,日志就记多久,最后用Excel或pandas就能分析趋势。压测结束重点看几个值:
- 温度是否超过85度,持续太高会对芯片寿命有影响;
- 功耗是否稳定,波动过大说明供电在跳变;
- 显存利用率是否随着时间持续走高,如果是,很有可能显存泄漏;
- GPU利用率曲线是否平滑,锯齿状说明没吃饱。
如果想更直观,我还习惯用一个开源工具nvitop,它在终端里以面板方式展示所有GPU的实时状态,比裸看nvidia-smi舒服得多。安装很简单:
pip install nvitop nvitop3.5 第五步:从单卡压测升级到多卡压测
单卡能稳定跑,不代表多卡能稳定。MoE大模型的多卡推理,通信开销非常可观。如果用的是A100/H100,NVLink的带宽足够高,一般不怎么会卡;但如果服务器是PCIe连接的消费级显卡,比如两片4090,多卡并行时集合通信很可能变成瓶颈,GPU利用率会显得“参差不齐”。
多卡压测时,vLLM的启动要把--tensor-parallel-size改成实际卡数:
python -m vllm.entrypoints.openai.api_server \ --model /data/models/deepseek-llm-14b \ --tensor-parallel-size 4 \ --gpu-memory-utilization 0.90 \ --max-model-len 4096 \ --port 8000加载之后,用nvidia-smi确认四张卡都开始承担权重,显存占用是否均匀。如果其中一张卡的显存占用明显低于其他卡,说明切分不平衡,这通常是因为模型结构对并行度不友好,或者tensor-parallel-size设置得不对。
压测脚本和单卡类似,但它更能暴露通信瓶颈。观察指标上有几点:各卡利用率是否同步波动,卡间显存是否均衡,压测过程中有没有卡掉线。如果出现其中一张卡利用率长期为0但服务还没挂,大概率是通信或模型切分出了问题。多卡压测结束后,我和单卡数据对比,可以作为判断“加卡值不值”的重要依据。
3.6 补充:用DeepSeek-Harness做更规范的负载管理
手工脚本适合做一次性验证,但如果想更系统、可重复地压测,我推荐把DeepSeek-Harness用上。它的一大特点是能定义“生成任务”:多少并发、每请求生成多少token、用什么样的prompt模板、持续多少轮,这些都可以作为harness任务的配置项写清楚。
它的用途其实更偏向模型评测和性能基准。在GitHub上搜deepseek-ai的harness仓库,安装之后按照说明写好配置文件,用一行命令启动就能批量跑负载。它会输出详细的性能指标,包括请求总数、成功率、平均延迟、吞吐等。相比自己写脚本,harness在统计这块更省心,统计口径也更标准。
当然,harness也有它的学习成本,配置文件需要考虑清楚并发模型。我的建议是,如果你只是临时验证一台服务器的性能,手写脚本完全够用。如果要做多次对比测试,或者团队里需要统一标准,那用harness更好。
4. 压测中常见的坑,和我的排查思路
4.1 GPU利用率上不去,原因不在GPU
压测时最让人困惑的现象:模型跑得好好的,GPU利用率却只有30%,CPU反而跑满。这种情况,十有八九不是GPU的锅。
有一种很常见的原因是输入长度太短。模拟请求如果只是“你好”这种几个token的输入,prefill阶段的计算量极小,模型大部分时间在等待网络和内存,GPU当然吃不满。解决办法很简单,把prompt长度拉长,比如几百个token的长文本,让prefill阶段有足够的矩阵计算量。
另一种是CPU成为瓶颈。请求进来之后要先经过tokenizer、数据校验,如果请求体很大、并发很高,Python那一层的开销会挡住大部分流量。这时候在压测脚本上做优化,不如直接上vLLM这类自带高效调度引擎的推理框架,把请求队列放在后端管理。
还有情况是并发太低了。单并发请求大模型,GPU只能在一个请求的上下文中干活,等待时间长,利用率自然上不去。把并发提到16或者32,让多个请求交错执行,GPU利用率才可能打满。压测时加并发,看利用率跟着走,基本就能定位问题。
4.2 CUDA OOM和显存泄漏的判定
压测过程中最常见的中断就是CUDA out of memory。一开始我以为是A100 80G显存很大,随便造。实际跑起来发现,7B模型看着只占20G,但并发一高,KV Cache猛涨,显存直接爆掉。
解决思路有几个。最直接的是把vLLM的--gpu-memory-utilization调低一点,比如从0.90改成0.80,给显存留更多缓冲。但这会减少KV Cache容量,吞吐量会下降。更合理的做法是限制最大并发数,在压测脚本里加重试和退避机制。
判断是不是显存泄漏,我会看压测结束后的显存曲线。如果发现压测停止后,显存占用长时间不回落,说明有显存泄漏的嫌疑。这时用ps查看进程,把vLLM停掉再启动,看显存是否归零。如果是模型框架的bug,就升级到修复后的版本。
4.3 压测过程中掉卡、温度过高怎么办
掉卡是最让人头疼的。gpu-burn跑得好好的,突发请求上来就掉驱动,通常不是软件问题,而是硬件不稳。常见原因包括:电源功率不足、PCIe插槽供电接触不良、显存过热。排查时先把日志打出来:
dmesg -T | grep -i nvidia如果看到Xid 79之类的错误,很可能是显存控制器或供电问题。这行日志会直接定位到具体是哪个GPU发生了错误。如果是多卡机器,先把出问题的卡隔离掉(用nvidia-smi -i 3 -c EXCLUSIVE_PROCESS等方式控制),避免它拖垮整机。
温度过高也有技巧可排查。A100的正常工作温度在65到85度之间,H100在85度左右,超过90度就要警惕。如果是风冷机箱,可以先清理灰尘、检查风扇;如果散热没问题但温度还是高,就要考虑数据中心机房的进风温度和环境气流组织。服务器的“压力测试”其实也是对基础设施的考验。
4.4 压测结果怎么看,才算“通过”
压测完事,数据摆在那里,怎么判断这台机器合不合格?我的标准比较务实:
- 连续跑4小时以上,无掉卡、无请求失败(错误率低于0.1%);
- 各GPU利用率在负载阶段高于85%,显存使用率稳定;
- 温度在安全区间内,不会随着时间缓慢攀升;
- 功耗达到型号规格的90%以上,说明供电充足;
- 吞吐量和延迟在同型号卡的历史数据或网上公开基准数据的合理区间内;
- 多卡并行时,各卡利用率和显存占用大致均衡,偏差不超过15%。
当然,这里的数值没有绝对标准,更多是提供一种判定逻辑。更关键的是要把压测结果和业务需求对应起来,比如线上推理要求单token延迟低于100ms,那压测的统计口径就要以“是否达到业务SLA”为准,而不是盯着理论峰值。
5. 压测过程中顺手记录的几个经验技巧
这一节算是我个人比较喜欢的“私货”部分。第一次压测的时候,我犯过一个错误:压测跑完后没有做数据留存,后面换了一个模型,想对比一下两次的性能差异,结果发现完全没有可对比的历史数据。从那之后,我养成了每次压测都在固定目录下保存报告的习惯。
压测报告的格式不固定,至少记录:服务器型号、GPU型号和数量、驱动版本、CUDA版本、模型名称、并发数、请求总量、平均首token延迟、平均吞吐、最大温度和功耗、有无错误日志。这些信息拼在一起,才是下一轮调优的基础。
另外一个小技巧是关于压测时间的。很多人压测跑10分钟就觉得够了,但真实的生产环境可能24小时都在跑推理。我在自己机器上测试时,发现有些潜在问题要跑1小时以上才会浮出来,比如微小显存泄漏、风扇策略在温度临界点时来回跳变。所以我的建议是,第一次压测跑4小时,之后每次变更(比如换驱动、换模型)再跑30分钟足够。
还有一件事,压测前记得把系统日志和风扇策略设置好。有些服务器在BIOS里的风扇模式默认是“标准”,温度高了才加速,这会让压测前期温度很高。如果转成“全速”模式,散热会更及时,压测数据也更接近最优表现。当然全速模式的噪音很大,机房环境没问题,办公桌边的个人工作站就自己权衡一下。
再多提一句和网络相关的事情:如果你用vLLM起服务,然后从另一台机器发压测请求,网卡带宽和延迟也会影响结果。特别是请求量很大时,千兆网卡会直接把吞吐压到两三百token/s。要测服务器的真实推理上限,客户端和服务端最好在同一个万兆内网环境里。我自己就遇到过在办公网跨了几层交换机压测,结果延迟数据根本没参考价值。
最后说一个容易被忽略的毛病:栈内存和文件句柄限制。并发高的时候,Python线程多了可能导致“Cannot allocate memory”。压测前用ulimit -n看下文件句柄上限,调成65535以上,能少踩很多坑。
用DeepSeek给GPU服务器做压力测试,本质上是用一个真实的大模型推理工作负载,把服务器从软件到硬件的所有链路都压出原形。它不复杂,但需要你按部就班,一个环节一个环节验证。先把驱动和CUDA搞定,再用gpu-burn做硬件巡检,然后用vLLM拉起DeepSeek服务,最后用脚本或harness加压,过程中记录温度、功耗、利用率和吞吐。这套流程我已经在不同机器上反复用过多次,每一次都能发现一点新问题,也验证了“想搞清楚一台GPU服务器的底细,光看参数没用,跑一遍才知道”这个朴素道理。