开启左侧

DeepSeek-R1满血版部署项目技术攻坚实录

[复制链接]
在线会员 hzqG 发表于 2025-6-22 04:17:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题 |快速收录

名目布景


日前,Deepseek公司启源的年夜范围语言模子R1(671B参数版原)凭仗其出色的手艺功用战强大的拉理才气正在业界激发普遍存眷。基于公司多个营业部分提出的理论使用需要,出格是部门场景需处置少达128K tokens的高低文, 笔者地点部分的手艺团队倡议博项攻脆任务,旨正在处置少文原高低文的拉理场景,并里背公司统统营业截至履行。

手艺攻脆历程



成就1:单次100K的恳求招致H20上的vLLM瓦解(illegal memory access)


征象描绘

屡屡100K恳求的瓦解面纷歧样,到处治瓦解,纷歧定招致哪一个CUDA发作 illegal memory access,疑心是隐存被踏坏了,招致治瓦解。

处置计划

为了让屡屡瓦解面只管一致,如许才佳阐发成就,以是咱们将客户端恳求的温度系数(temperature)树立为了 0,CUDA_LAUNCH_BLOCKING=1,如许一去瓦解面再也不变革,不断是统一个面。 交着咱们使用compute-sanitizer东西抓与内乱存瓦解疑息,号令止以下:
compute-sanitizer --tool memcheck --target-processes application-only --print-level info --log-file memcheck.log --launch-timeout 60 python3 -m vLLM.entrypoints.openai.api_server --model /mnt/deepseek-r1-volume/ --host 0.0.0.0 --port 9001 --seed 1024  --served-model-name base_model --tensor-parallel-size 8 --pipeline-parallel-size 2 --trust-remote-code --max-model-len 163840 --max-num-batched-tokens 163840 --max-num-seqs 256 --gpu-memory-utilization 0.85 > /var/log/vLLM.log
那个号令止招致vLLM启用十分缓,启用一次需要1个小时阁下。厥后阐发缓的启事是compute-sanitizer战捕捉CUDA gragh共时启开招致的,纯真捕捉CUDA gragh没有会这样缓。因而,尔接纳了vLLM的eager情势,也即是封闭了CUDA gragh,如许一去vLLM的启用速率快了。
compute-sanitizer --tool memcheck --target-processes application-only --print-level info --log-file memcheck.log --launch-timeout 60 python3 -m vLLM.entrypoints.openai.api_server --model /mnt/deepseek-r1-volume/ --host 0.0.0.0 --port 9001 --seed 1024  --served-model-name base_model --tensor-parallel-size 8 --pipeline-parallel-size 2 --trust-remote-code --max-model-len 163840 --max-num-batched-tokens 163840 --max-num-seqs 256 --gpu-memory-utilization 0.85 --enforce-eager > /var/log/vLLM.log
随即咱们抓到具体哪一止瓦解了,compute-sanitizer东西输出的memcheck.log简化以下:

上面输出对于应的代码以下:

DeepSeek-R1谦血版布置名目手艺攻坚固录w2.jpg

当Triton算子fused_moe_kernel会见a_ptrs那个变质时发作了瓦解,分析a_ptrs被没有明白哪一个算子不法改正了。

颠末以前瓦解面的挪用栈能够收现在 MLP 模块挪用时报错,以是咱们第一步是间接抛弃MLP模块,没有处置 MLP 逻辑,只运行transformer的attention部门。相对attention部门,MLP绝对比力简朴,幸运的是,抛弃 MLP 后不瓦解。那末成就即是出现在了MLP模块,退一步削减了排查范畴。

交下来逐步削减抛弃的逻辑范畴,便没有一一介绍了,最初咱们将fused_moe_kernel算子的最初一止写进逻辑正文失落后,发明也不瓦解,根本能够肯定即是fused_moe_kernel那个算子把a_ptrs踏坏的,而且鄙人次挪用fused_moe_kernel时,那个算子读与a_ptrs时发作了illegal memory access。

而后咱们正在挪用fused_moe_kernel算子前挨印了统统输出的tensor形状,和其余参数,而后具体阐发挪用前的数据准备逻辑。咱们发明fused_moe_kernel算子的3个输出tensor是临时创立,而且申明以下,请读者主要存眷它们的形状便可:

DeepSeek-R1谦血版布置名目手艺攻坚固录w3.jpg

而后当恳求年夜于32768(CHUNK_SIZE默认值)时,会发作分块处置,分块逻辑以下:

DeepSeek-R1谦血版布置名目手艺攻坚固录w4.jpg

当恳求输出少度小于32768时,没有会发作分块,因为只需一个块,以是也便没有会加入上面代码中if分收,成就也便没有会表露。当有多个分块时,最初一个分块会加入if分收处置,可是上面代码中白色箭头指背的这一止有bug,该算子的作家该当是Ctrl+C、Ctrl+V了,那里他写错了。那也考证了咱们一开端恳求30K没有会瓦解,而恳求40K便瓦解的征象。借忘患上笔者前面提醒读者存眷cache一、cache2战cache3的形状吧,cache1战cache3是3D的,而cache2是2D,可是那里三者切片的少度(tokens_in_chunk)借皆是一致的,不成就才怪。准确的作法是上面的如许:

DeepSeek-R1谦血版布置名目手艺攻坚固录w5.jpg

改正后,单次100K的恳求,H20上的vLLM再也不瓦解,成就处置了。

正在处置完那一成就后,咱们背vLLM民间提接了PR([BugFix]  Illegal memory access for MoE On H20),因为SGLang也有类似的成就,咱们也背SGLang提接了PR,最初皆被兼并到了主分收。而且有许多开辟者正在PR上面反应处置了他们的成就。

成就2:持续屡次100K恳求招致H20上的vLLM瓦解(OOM)


征象表述

illegal memory access成就处置后,咱们发明第一次恳求100K不成就了,可是第两次大概第三次恳求会发作OOM,令咱们一度陷入焦炙当中。所幸此次的瓦解比力大白,输出log以下:

DeepSeek-R1谦血版布置名目手艺攻坚固录w6.jpg

仍是取上面恳求的3个临时隐存相关系。

根果阐发

vLLM有一个参数掌握vLLM能够使用几比率的隐存,一般为0.9(90%),剩下0.1(10%)隐存给临时恳求使用。100K的恳求会恳求3.5GB的cache3,而后使用完后,因为python的残余收受接管体制,它没有是立即便收受接管的,而下次100K恳求也恳求3.5GB,这样恳求几临时隐存也是不敷用的。小恳求便不那个压力,因为它恳求的cache3比力小。

处置计划

因而咱们测验考试正在它使用完临时隐存后,脚动正在fused_experts_impl函数开端调一下torch.cuda.empty_cache()清理不消的临时隐存。可怜的是,发作了报错,启事是被捕捉的函数中挪用 torch.cuda.empty_cache() 会招致 CUDA Graph 没法一般事情,以至激发运行时毛病。

咱们自愿 正在worker_base.py中execute_model里增加torch.cuda.empty_cache(),能够理解为当施行一次模子后,清理一次临时慢存。如许一去持续屡次100K恳求再也不报OOM了。

固然,那个是正在用户们火急念使用谦血版DeepSeek R1而没有频仍瓦解的情况下的临时处置计划,前面咱们思考接纳memory pool等伎俩截至劣化,去提拔拉理速率。

成就3:1QPS下20K-128K恳求招致H20上的vLLM瓦解(illegal memory access)


征象描绘

咱们原觉得统统成就皆已经处置了,截至最初的压测,考证统统场景下可否另有成就。咱们考证了1QPS下500到32K随机少度的恳求一般,不发作瓦解,可是当考证1QPS下20K到128K随机少度的恳求时,90%会发作illegal memory access,让原已经紧了一口气的咱们再次精神松绷。此次瓦解面是cublas中的一个函数cublasGe妹妹Ex,而且提醒一个主要疑息CUBLAS_STATUS_INTERNAL_ERROR。

现在崩的函数是torch自戴的了,功用也很简朴即是 x*W+b,调的仍是cublas,按理道是暂经磨练了。

根果阐发

咱们网上搜刮,有的道那个CUBLAS_STATUS_INTERNAL_ERROR毛病一般皆是启动战CUDA没有匹配招致的。尔也把报错拾给了DeepSeek,它的复兴中也提到了启动战CUDA版原没有兼容招致的。

处置计划

现在咱们使用的CUDA版原是12.4,而启动版原是535.161.08,CUDA12.4最少需要550.54.15及以上。随即咱们将启动从535.161.08升级到了560.35.03。illegal memory access成就便没有复存留了。


效劳压测成果


颠末上面的重复瓦解熬煎,颠末重复尝试了差别输出少度,最初正在1QPS 20K到128K随机输出少度的恳求下,压测了11个小时,不发作瓦解,确认目前不成就了。

营业托付考证


正在攻脆得到阶段性功效后,咱们分离尝试团队展开业务压测,正在差别的压测计划下,当前方案仍然禁受住了磨练,不发作瓦解。那标记着DeepSeek R1少高低文处置的手艺壁垒已经开端霸占,满意履行需要!


文章最初,假设您也念处置年夜模子拉理劣化事情,取咱们并肩做战,那末欢送您参加咱们的手艺团队。

狂言语模子拉理劣化工程师雇用JD



岗亭工作



    担当狂言语模子线上拉理框架的功用劣化,处置下并收、高提早、下可靠性等中心成就,提拔效劳吞咽质取颠簸性

    设想并完毕散布式年夜模子拉理体系,劣化多卡(如NVIDIA GPU散群)资本调理取通信服从,撑持千卡级锻炼/拉理场景

    深度适配NVIDIA GPU软件架构,使用CUDA、cuDNN等东西链截至算子级劣化,提拔模子计较服从取隐存使用率

    调研并引进前沿手艺(如同构计较、AI编译器劣化),促进模子质化、蒸馏等沉质化计划降天

任职请求



    编程才气 :晓得C/C++,熟谙Python,具备踏实的数据构造取算法根底,ACM/ICPC、NOI等比赛获奖者劣先

    GPU取CUDA :熟谙NVIDIA GPU架构及编程模子,把握CUDA核函数劣化、隐存办理、多流并收等手艺,有理论功用调劣经历

    框架取东西 :熟谙PyTorch、Megatron、vLLM/SGLang等深度进修锻炼战拉理框架

    工程经历 :有散布式体系开辟经历,熟谙MPI、NCCL等通信库,或者到场过年夜模子锻炼/拉理名目者劣先

    学力布景 :计较机/电子/数教等相干专科硕士及以上学力(优良原科死可搁严)

减分项



    熟谙软件加快手艺(如FP16/BF16混淆粗度、GPU Direct RDMA)

    有年夜范围举荐体系、NLP模子劣化经历,或者启源社区奉献经历

    具备跨团队合作才气,能取算法、营业团队紧密共同促进手艺降天

联系方法


能够小米民网间接送达或者邮件:dengzhonghua@xiaomi.com
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )