写点什么

NPU 适配推荐系统 GR 模型流程

  • 2025-05-27
    上海
  • 本文字数:2499 字

    阅读完需:约 8 分钟

1.适配说明

本样例为开源 Generative Recommendations 模型, 将其迁移至 NPU 侧训练,并使用 NPU 的 HSTU 融合算子来实现性能的优化。模型参考的开源链接为https://github.com/facebookresearch/generativerecommenders


克隆源码并固定版本为:Commits on Dec 16, 2024,提交的 SHA-1 hash 值(提交 ID):bb389f9539b054e7268528efcd35457a6ad52439


验证运行的算力平台:Atlas 800T A2


2.启动容器

镜像下载地址:https://www.hiascend.com/developer/ascendhub/detail/9faeb4847b3e419f81b78a4d0ed574b5


该镜像中部分配套版本说明:


启动容器命令参考:


docker run \-u root \-it \--name ${container_name} \--net=host \--shm-size="300g" \--privileged \-v /etc/localtime:/etc/localtime \-e ASCEND_VISIBLE_DEVICES=0-7 \-v /etc/ascend_install.info:/etc/ascend_install.info \-v /home:/home \-v /root/ascend:/root/ascend \-v /root/.ssh:/root/.ssh \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \${image_name} \/bin/bash
复制代码

3.安装依赖

下载最新版本的 mindxsdk-mxec-add-ons 安装包https://clouddrive.huawei.com/hwshare/f3ea4909559eae5305e42c02b5c3f06c?type=email&fileId=135327&ownerId=2088277&fileSize=22379519&fileName=QXNjZW5kLW1pbmR4c2RrLW14cmVjLWFkZC1vbnMtcG9jLWxpbnV4LXg4Nl82NC50YXIuZ3o=&isFolder=false


解压之后,进入文件夹 mindxsdk-mxec-add-ons-poc:


cd mindxsdk-mxec-add-on-poccd torch_plugin# 执行命令安装:pip3 install torch_npu-2.1.0.post9-cp311-cp311-linux_x86_64.whl
复制代码

4.安装适配算子

重新进入文件夹 mindxsdk-mxec-add-ons, 安装需要的昇腾适配算子:jagged_to_padded_dense、IndexSelect 优化、 dense_to_jagged、asynchronous_complete_cumsum、gather_for_rank1


cd mindxsdk-mxec-add-ons-poc/mxrec_opsbash mxrec_opp_asynchronous_complete_cumsum.runbash mxrec_opp_dense_to_jagged.runbash mxrec_opp_index_select_for_rank1_backward.runbash mxrec_opp_jagged_to_padded_dense.runbash mxrec_opp_gather_for_rank1.runbash mxrec_opp_hstu_dense_forward.runbash mxrec_opp_hstu_dense_backward.run
复制代码

5.编译融合算子依赖的 lib

进入 torch_library 文件夹:


cd mindxsdk-mxec-add-ons-poc/torch_librarycd 2.1.0/hstubash build_ops.sh
复制代码


如果在编译过程中有 gcc 版本的问题:


重新设置 gcc 路径:


which gccwhich g++unset CC CXXCC=/usr/local/gcc10.2.0/bin/gccCXX=/usr/local/gcc10.2.0/bin/g++ bash build_ops.sh
复制代码


执行完以上命令之后,融合算子的依赖包 libhstu_dense_ops.so 会生成在同目录下的 build 文件夹下,可将该 so 包拷贝到某固定目录下。示例如下:


cp ./build/libhstu_dense_ops.so /home/torch_ops/
复制代码

6.下载源码

git clone https://gitee.com/ascend/RecSDK.gitcd RecSDKgit checkout branch_v7.0.0-POC_torchcd ./torch/examples/generative_recommenders/npugit clone https://github.com/facebookresearch/generative%02recommenders.git
复制代码


下载开源的 gr 模型,以及昇腾的 RecSDK

模型修改:

将 Generative Recommendations 模型迁移到 NPU 上并适配 NPU 融合 HSTU 算子,代码修改部分已经编写在 NPU_GR.patch 中,载入命令如下:


cd generative-recommenderscp ../NPU_GR.patch ./git checkout bb389f9539b054e7268528efcd35457a6ad52439git apply NPU_GR.patch
复制代码

数据集下载

python preprocess_public_data.py
复制代码

代码修改:

vim ./generative_recommenders/trainer/train.py注释掉from msprobe.pytorch import seed_all
复制代码


msprobe 是精度模式下对比,与 GPU 的 loss 进行对比(Ascend 内部插件)msprobe 路径:https://gitee.com/ascend/mstt/tree/master/debug/accuracy_tools/msprobe

config 文件:

创建一个 hstu-mt-3400.gin 文件,文件内容如下。将该 gin 文件放置在 generative_recommenders/configs/ml-1m/ 目录下


train_fn.dataset_name = "ml-1m"train_fn.max_sequence_length = 3389train_fn.local_batch_size = 32train_fn.main_module = "HSTU"train_fn.dropout_rate = 0.2train_fn.user_embedding_norm = "l2_norm"train_fn.num_epochs = 1train_fn.item_embedding_dim = 512hstu_encoder.num_blocks = 3hstu_encoder.num_heads = 2hstu_encoder.dqk = 256hstu_encoder.dv = 256hstu_encoder.linear_dropout_rate = 0.2train_fn.learning_rate = 1e-3train_fn.weight_decay = 0train_fn.num_warmup_steps = 0train_fn.interaction_module_type = "DotProduct"train_fn.top_k_method = "MIPSBruteForceTopK"train_fn.loss_module = "SampledSoftmaxLoss"train_fn.num_negatives = 128train_fn.eval_interval = 50train_fn.sampling_strategy = "local"train_fn.temperature = 0.05train_fn.item_l2_norm = Truetrain_fn.l2_norm_eps = 1e-6train_fn.enable_tf32 = Truetrain_fn.precision_mode = False
create_data_loader.prefetch_factor = 128create_data_loader.num_workers = 8
复制代码


hstu_encoder.dqk 和 hstu_encoder.dv 参数配置必须是 16 的整数倍。注意力机制的 query,key,value 的维度信息)

运行命令:

修改 run.sh 脚本,使用 hstu-mt-3400.gin 配置文件:当使用 hstu 融合算子时,hstu_encoder.dqk,hstu_encoder.dv 必须为 16 的整数倍


export USE_NPU_HSTU=1 # 使用融合算子export ENABLE_RAB=0export PYTORCH_NPU_ALLOC_CONF=expandable_segments:TrueASCEND_RT_VISIBLE_DEVICES=0 python3 main.py --gin_config_file=configs/ml-1m/hstu-mt-3400.gin --master_port=12345 | tee temp.log
复制代码


使用 hstu-sampled-softmax-n128-large-final.gin,配置文件:不使用融合算子


export USE_NPU_HSTU=0 # 不使用融合算子export ENABLE_RAB=0export PYTORCH_NPU_ALLOC_CONF=expandable_segments:TrueASCEND_RT_VISIBLE_DEVICES=0 python3 main.py --gin_config_file=configs/ml-1m/hstu-sampled-softmax-n128-final.gin --master_port=12345 | tee temp.log
复制代码

执行命令:

bash run.sh
复制代码

7.性能测试结果


用户头像

还未添加个人签名 2024-12-19 加入

还未添加个人简介

评论

发布
暂无评论
NPU适配推荐系统GR模型流程_永荣带你玩转昇腾_InfoQ写作社区