Atlas 800 3010如何让模型使用指定的npu进行推理?
收藏回复举报
Atlas 800 3010如何让模型使用指定的npu进行推理?
t('forum.solved') 已解决
发表于2025-07-24 16:18:01
0 查看

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不知道是怎么出现的,有大佬的话希望可以解释一下)

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,我不知道怎么做到的...

运行的bge模型流的到处都是

解决方案

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包的了解不太清楚,也算是被版主点醒了问题所在,才有下一步的排查方向,。

本帖最后由 匿名用户2025/07/25 14:02:19 编辑

我要发帖子