Ascend 3010如何让模型使用指定的npu进行推理
这个标题描述不是这么的准确。
确切来说,我想知道在设备有多npu的情况下,用torch进行推理,如何约束只使用指定的一个或者多个npu
这个问题已经解决了,如果了解问题的话,可以直接跳转到下方的 > 解决方案(我不知道这个怎么写本文的跳转链...你可以搜索一下?)
背景环境:
我的服务器中计划运行多个模型,一部分是通过mindie运行的(qwen2-instruct),一部分是做embedding和rerank用的,BAAI的bge模型(后面还有一个Janus-Pro);
版本表:
- torch == 2.5.0这版本真不是我想用250...当然你特意花时间看了下我这行小字...我本来想弄到看不见的但是似乎被优化到肉眼可见了所以,献丑了...
- torch_npu == 2.5.0
- python3.11.13
问题
我发现我在多次运行脚本(我贴下面了)之后,npu的状态变成了全部都在使用(见图),几乎所有的npu设备里都多了一个python的进程(1308是 bge-reranker-v2-m3的占用,102不知道是怎么出现的,有大佬的话希望可以解释一下)
P.S. 不要太在意最后一条test,我瞎写的小东西,单纯测试下大量内容下的rank结果如何。
不过它的结果挺意外的,告诉我某月有多少个bug的score高达0.55868819,我不知道怎么做到的...

解决方案
docker
我想到的解决方案是通过docker进行隔离,分配进去具体的显卡,再通过修改环境变量来设置可访问的显卡;
不过这个不是我的本意,我还是期望可以放到docker环境外部署的(性能考虑),所以想了解下有没有其它方案
修改代码
我看了下FlagReranker的代码,发现里面有一个devices参数
改成这样就可以达到我想要的效果了:
一些杂七杂八
你问我为什么不用Mindie一起部署?
我也想,但是我看modelzoo里没有这些个模型,想应该是没有做兼容吧,就没想了...
当然你要是有成功的经验的话——
let us know
我在现在的开发&问题处理的时候基本上都是直接依赖gpt的,以至于很多过去的排查思路都产生了变化,,因为直接问太方便了,后就慢慢就丢了自己推理的逻辑链了,。
当然在这个问题其实是源自于我对torch包的了解不太清楚,也算是被版主点醒了问题所在,才有下一步的排查方向,。
Ascend 3010如何让模型使用指定的npu进行推理
这个标题描述不是这么的准确。
确切来说,我想知道在设备有多npu的情况下,用torch进行推理,如何约束只使用指定的一个或者多个npu
这个问题已经解决了,如果了解问题的话,可以直接跳转到下方的 >
解决方案(我不知道这个怎么写本文的跳转链...你可以搜索一下?)背景环境:
版本表:
问题
我发现我在多次运行脚本(我贴下面了)之后,npu的状态变成了全部都在使用(见图),几乎所有的npu设备里都多了一个python的进程(1308是
bge-reranker-v2-m3的占用,102不知道是怎么出现的,有大佬的话希望可以解释一下)class RerankerV2: def __init__(self): from FlagEmbedding import FlagReranker import torch if hasattr(torch, "npu") and torch.npu.is_available(): torch.npu.set_device(4) self.model = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True) def rank(self, query: str, documents: list[str]): return self.model.compute_score([(query, r) for r in documents], normalize=True) # 本来想拆分出两个文件的,但是想了下这样写方便切换使用(毕竟这种rerank模型没有必要动态切换,之间也没有什么特别的优劣) reranker = RerankerV2() def test(query): attention = [ "告诉我某月有多少个bug", "统计某年出现了多少个bug单" "查询某个字段的值", # find 中 projection "统计某种数据的总数", # countDocuments / $count "按照条件过滤数据", # find + filter 条件 "获取某个字段的唯一值", # distinct "根据时间范围筛选记录", # range filter "使用正则模糊匹配字段", # $regex "根据多个条件联合查询", # $and / $or "对查询结果排序", # $sort "分页查询数据", # skip + limit "判断某字段是否存在", # $exists "聚合多个字段生成新字段", # $project + $concat / $addFields "查询字段为 null 或缺失的记录", # null / not exists "统计某字段的最大最小值", # $group + $max / $min "筛选某字段包含关键字的记录", # $regex or $text "获取最新一条记录", # $sort + limit(1) "判断是否存在符合条件的记录" # findOne / count > 0 ] scores = reranker.rank(query, attention + []) print("query: ", query) print("document: ", attention) # print("scores: ", softmax(scores)) print("scores: ", scores) def test_rank(): test("IOT平台2025年12月有多少个bug") test("IOT平台2025年12月有多少个需求?") test("系统管理员如何添加员工") test("今天天气真好啊") test("补一个设定 第一阶段的结尾(泽做全了通往另外分支的准备),泽穿戴好装备,便开始了计数,向着实验场的中心跑去。(这段也要改一下,改成冷冻仓+发射轨道,内部穿着宇航服,应对不时之需)(传送过程中冷冻仓被裁切掉,刚越过分支的时候,因气体逃逸导致泽在宇宙中疯狂翻滚,几次撞击后宇航服的氧气存量也不高了,大概40%左右,十来分钟) 突然,一只口袋空间在正面前打开,只是一秒,泽便消失在了口袋空间中。 通信全断。 他被吸入了真空,然后口袋从这个世界中消失,一群亮晶晶的尘雾从中间置换了出来,融入在了实验室的空气中。泽用的装备是为了在真空生存下去的,有点像是一个可以运动的冷冻仓,有一定的氧气存量,目的就是在那个地方可以生存一段时间,直到Niyredra能找泽")P.S. 不要太在意最后一条test,我瞎写的小东西,单纯测试下大量内容下的rank结果如何。
不过它的结果挺意外的,
告诉我某月有多少个bug的score高达0.55868819,我不知道怎么做到的...解决方案
docker
我想到的解决方案是通过docker进行隔离,分配进去具体的显卡,再通过修改环境变量来设置可访问的显卡;
不过这个不是我的本意,我还是期望可以放到docker环境外部署的(性能考虑),所以想了解下有没有其它方案
修改代码
我看了下
FlagReranker的代码,发现里面有一个devices参数改成这样就可以达到我想要的效果了:
reranker = RerankerV2() class RerankerV2: def __init__(self): from FlagEmbedding import FlagReranker self.model = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True, devices=["npu:4"]) def rank(self, query: str, documents: list[str]): return self.model.compute_score([(query, r) for r in documents], normalize=True) # 本来想拆分出两个文件的,但是想了下这样写方便切换使用(毕竟这种rerank模型没有必要动态切换,之间也没有什么特别的优劣) reranker = RerankerV2()一些杂七杂八
你问我为什么不用Mindie一起部署?
我也想,但是我看modelzoo里没有这些个模型,想应该是没有做兼容吧,就没想了...
当然你要是有成功的经验的话——
let us know
我在现在的开发&问题处理的时候基本上都是直接依赖gpt的,以至于很多过去的排查思路都产生了变化,,因为直接问太方便了,后就慢慢就丢了自己推理的逻辑链了,。
当然在这个问题其实是源自于我对torch包的了解不太清楚,也算是被版主点醒了问题所在,才有下一步的排查方向,。