Tlntin / qwen-ascend-llm

Apache License 2.0
27 stars 2 forks source link

说明

准备工作

  1. 下载本项目

    git clone https://github.com/Tlntin/qwen-ascend-llm.git
  2. 下载qwen1.5/qwen2的模型,选择chat模型或者instruct模型,将其放到download文件夹,仅支持huggingface下载的模型,网络不好的可以用镜像站:https://hf-mirror.com/Qwen

Docker运行相关

(可选)验证模型结构

详细运行步骤

步骤1:编译模型(以Qwen2-1.5B-Instruct)为例。
  1. 除了上面说的CANN环境安装外,还需额外安装一些python模块(当然,你也可以使用docker构建开发环境,但是注意你的芯片和对应的得是310B系列,如果不是,需要参考官方镜像文档做一些修改)。

    cd qwen-ascend-llm
    pip install -r ./requirements.txt
  2. 导出onnx,当前我设置的kv-cache长度为2048,可以根据自己的内存、显存来设置更大参数,最大则不建议超过max_position_embeddings这个数,可以去模型里面的config.json文件里面看,qwen2-1.5B-Instruct里面,这个数值为32768

    python3 export/export_onnx.py \
    --device_str=npu \
    --dtype=float16 \
    --hf_model_dir="./download/Qwen2-1.5B-Instruct" \
    --onnx_model_path="./output/onnx/qwen2_1.5b_chat.onnx" \
    --kv_cache_length=2048
  3. 验证onnx,返回项目根目录,运行cli_chat.py,测试一下onnx对话是否正常(注意:由于是cpu运行,所以速度较慢,请耐心等待)。

    • --max_input_length为单次最大可以输入是数据量,该数值必须小于编译onnx的时候指定的--kv_cache_length
    • --max_output_length则必须和之前转onnx的时候指定的--kv_cache_length保持一致,否则onnx输出将会异常。
    • 注:最大可以生成token数=max_output_length-min(max_input_length, 实际输入的token数)
    • npu转出的onnx,dtype取float16,cpu转出来的onnx,dtype取float32
    • --cpu_thread根据你的cpu线程数设置,默认取4
      python3 ./cli_chat.py \
      --session_type=onnx \
      --hf_model_dir="./download/Qwen2-1.5B-Instruct" \
      --onnx_model_path="./output/onnx/qwen2_1.5b_chat.onnx" \
      --dtype="float16" \
      --cpu_thread=4 \
      --max_input_length=1024 \
      --max_output_length=2048
  4. 改变onnx结构,目前导出的Trilu算子有些问题,atc命令无法识别,需要改一下结构。

    python3 export/change_node.py \
    --input_model_path="./output/onnx/qwen2_1.5b_chat.onnx" \
    --output_model_path="./output/onnx2/qwen2_1.5b_chat.onnx"
  5. 转onnx为om模型, 将修改后的onnx利用atc命令导出到onnx,注意此处的om_model_path不带.om后缀

    • 运行过程可能会有一些警告,或者子图融合报错,只要结果是提示success就说明没啥问题。
    • kv_cache_length长度和第一步导出onnx时的长度保持一致。
    • --max_prefill_length为prefill阶段,单次能处理的最大长度,该数值越长则越能降低首字延迟,但是相应的onnx转om的时间也会变长。设置该数值时,一般为2的指数,例如2、4、8、16等等,推理时会利用递归自动匹配合适的prefill长度,例如输入12,会匹配[8, 4]。当前默认数值为4,如果设置为1,则不会开启动态shape推理功能。注意:开启动态shape后,模型体积会有50%-100%的增长,并且推理时占用的内存也会相应增长,如果对内存比较敏感,则建议关闭动态shape。
    • 该脚本会自动检测你的NPU类型,如果你想手动指定,可以加上--soc_version=xxxx来指定,例如--soc_version=Ascend310B1
    • --kv_cache_length的数值必须前面转onnx的时候指定的--kv_cache_length保持一致,否则大概率会转换失败。
    • --cpu_thread为转onnx为om时,开启的cpu线程数,默认为1个线程并行编译,如果内存很多(每个线程单独占用一份内存,所以很费内存),可以调高一些。
      python3 export/onnx2om.py \
      --hf_model_dir="./download/Qwen2-1.5B-Instruct" \
      --onnx_model_path="./output/onnx2/qwen2_1.5b_chat.onnx" \
      --om_model_path="./output/model/qwen2_1.5b_chat" \
      --kv_cache_length=2048 \
      --cpu_thread=1 \
      --max_prefill_length=4
步骤2:在终端运行模型进行对话
步骤3:部署兼容OpenAI的api

(可选)对比onnx和om网络层结果

当前功能