HuggingFace镜像/qwen1.5_14b_chat
模型介绍文件和版本分析
下载使用量0

Qwen1.5-14B-Chat

Introduction

Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. In comparison with the previous released Qwen, the improvements include:

  • 8 model sizes, including 0.5B, 1.8B, 4B, 7B, 14B, 32B and 72B dense models, and an MoE model of 14B with 2.7B activated;
  • Significant performance improvement in Chat models;
  • Multilingual support of both base and chat models;
  • Stable support of 32K context length for models of all sizes
  • No need of trust_remote_code.

For more details, please refer to our blog post and GitHub repo.

Model Details

Qwen1.5 is a language model series including decoder language models of different model sizes. For each size, we release the base language model and the aligned chat model. It is based on the Transformer architecture with SwiGLU activation, attention QKV bias, group query attention, mixture of sliding window attention and full attention, etc. Additionally, we have an improved tokenizer adaptive to multiple natural languages and codes. For the beta version, temporarily we did not include GQA (except for 32B) and the mixture of SWA and full attention.

Requirements

The code of Qwen1.5 has been in the latest Hugging face transformers and we advise you to install transformers>=4.37.0, or you might encounter the following error:

KeyError: 'qwen2'.

Usage

We do not advise you to use base language models for text generation. Instead, you can apply post-training, e.g., SFT, RLHF, continued pretraining, etc., on this model.

加载镜像

获取到镜像压缩包,例如mindie-1.0.RC3-800I-A2-arm64-OpenMind.tar.gz,则运行如下命令:

docker load -i mindie-1.0.RC3-800I-A2-arm64-OpenMind.tar.gz

加载完成之后,请使用docker images命令查找具体镜像名称与标签。

容器启动

1. 准备模型

  • 下载魔乐仓库承载的模型,可以使用:
git clone https://modelers.cn/MindIE/qwen1.5_14b_chat.git

目录结构应为如下:

├── qwen1.5_14b_chat
│   ├── README.md
│   └── atb_models
  • 获取模型权重

    • 本地已有模型权重 从您信任的来源自行获取权重后,放置在从上述下载的模型代码的主目录下,放置后的目录结构应为如下:

      ├── qwen1.5_14b_chat
      │   ├── README.md
      │   └── atb_models
      │   └── 权重文件1
      │   ...   
      │   ...
      │   └── 权重文件n
    • 本地没有模型权重 我们提供模型权重下载脚本,支持HuggingFace,ModelScope以及Modelers来源的模型下载,用法如下

      1. 确认atb_models/build/weights_url.yaml文件中对应repo_id,当前已默认配置模型官方认可的下载地址,如您有其他信任来源的repo_id,可自行修改,默认配置如下:
      HuggingFace: Qwen/Qwen1.5-14B-Chat
      ModelScope: Qwen/Qwen1.5-14B-Chat
      Modelers: None
      1. 执行下载脚本atb_models/build/download_weights.py:
      参数名含义
      hub可选,str类型参数,hub来源,支持HuggingFace, ModelScope, Modelers
      repo_id可选,str类型参数,仓库ID,默认从weight_url.yaml中读取
      target_dir可选,str类型参数,默认放置在atb_models同级目录下
  • 修改模型文件夹属组为1001,执行:

chown -R 1001:1001 /path-to-weights/qwen1.5_14b_chat
chmod -R 750 /path-to-weights/qwen1.5_14b_chat

2. 启动容器

  • 挂载模型 需要在容器启动命令中挂载模型-v /path-to-weights/qwen1.5_14b_chat:/home/HwHiAiUser/Ascend/qwen1.5_14b_chat,同时设置模型路径为--model /home/HwHiAiUser/Ascend/qwen1.5_14b_chat。
  • 执行以下启动命令(参考):
docker run --shm-size=1g \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci0 \
    --device=/dev/davinci1 \
    --device=/dev/davinci2 \
    --device=/dev/davinci3 \
    --device=/dev/davinci4 \
    --device=/dev/davinci5 \
    --device=/dev/davinci6 \
    --device=/dev/davinci7 \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/sbin:/usr/local/sbin \
    -v /path-to-weights/qwen1.5_14b_chat:/home/HwHiAiUser/Ascend/qwen1.5_14b_chat \
    mindie:1.0.RC3-800I-A2-arm64-OpenMind \
    --model /home/HwHiAiUser/Ascend/qwen1.5_14b_chat

执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出:

Daemon start success!

则认为服务成功启动。

通过修改mindie:1.0.RC3-800I-A2-arm64-OpenMind后的参数(比如--model参数),来实现不同的操作,比如切换后端,指定NPU卡等。

更多信息可参考官网信息:MindIE Service

服务框架参数

在启动MindIE服务时,除了通过 --model 参数来指定模型权重路径,还可以配置以下参数来优化服务性能和定制运行环境,更多参数说明请参考配置参数说明文档:

  1. --model

    • 说明:设置模型的本地权重路径,系统会从此路径加载模型。
    • 默认值:"/path-to-weights/model-name"
    • 取值规范:字符串类型,路径必须指向有效的本地模型文件夹。
  2. --model-name

    • 说明:指定模型的名称,用户可以通过此参数直接设置模型名称。
    • 默认值:模型权重路径中的文件夹名称(通过--model路径提取)。
    • 取值规范:字符串类型,如果未指定,将自动从--model的路径中提取名称。
  3. --max-seq-len

    • 说明:设定最大序列长度,输入长度与输出长度之和应小于等于此值。根据推理场景选择合适的长度。
    • 默认值:2560
    • 取值规范:整数类型,表示允许的最大序列长度。
  4. --max-iter-times

    • 说明:指定最大迭代次数,用于推理生成的最大token个数限制。
    • 默认值:512
    • 取值规范:整数类型,与--max-seq-len相关,表示最大生成长度。
  5. --max-input-token-len

    • 说明:设置最大输入的 token 长度。
    • 默认值:2048
    • 取值规范:整数类型。
  6. --max-prefill-tokens

    • 说明:设置预填充的最大 token 数量。
    • 默认值:8192
    • 取值规范:整数类型。
  7. --npu-device-ids

    • 说明:指定用于推理的NPU设备ID列表。
    • 默认值:取决于系统配置,会自动识别可用的设备。
    • 取值规范:字符串类型,包含设备ID的逗号分隔列表(如"0,1,2,3")。
  8. --world-size

    • 说明:指定参与推理的设备总数。
    • 默认值:根据系统配置自动计算。
    • 取值规范:整数类型,表示推理时使用的设备数量,如果手动配置了--npu-device-ids,必须要保证此项与其数量一致。
  9. --template-type

    • 说明:指定模板类型,用于Splitfuse相关操作。
    • 默认值:"Standard"
    • 取值规范:字符串类型,可选列表:"Standard","SplitwisePrefill","SplitwiseDecode","Mix"。
  10. --max-preempt-count

  • 说明:每一批次最大可抢占请求的上限,即限制一轮调度最多抢占请求的数量,取值大于0则表示开启可抢占功能。。
  • 默认值:0
  • 取值规范:整数类型,[0, maxBatchSize],当取值大于0时,cpuMemSize取值不可为0。
  1. --support-select-batch
  • 说明:batch选择策略:false表示每一轮调度时,优先调度和执行prefill阶段的请求。true表示每一轮调度时,根据当前prefill与decode请求的数量,自适应调整prefill和decode阶段请求调度和执行的先后顺序。
  • 默认值:false
  • 取值规范:布尔类型,true或false。
  1. --npu-mem-size
  • 说明:每个NPU设备的内存大小,单位为GB,指定为-1时自动分配。
  • 默认值:-1,当后端为ms时,默认值为8
  • 取值规范:整数类型,指定NPU设备的内存大小。
  1. --max-prefill-batch-size
  • 说明:预填充阶段的最大批处理大小,该参数主要是在明确需要限制prefill阶段batch size的场景下使用。
  • 默认值:50
  • 取值规范:整数类型,指定每次推理时的最大输入批量大小。
  1. --ip
  • 说明:设置服务的监听IP地址。
  • 默认值:"0.0.0.0"
  • 取值规范:字符串类型,必须是合法的IP地址。
  1. --port
  • 说明:设置服务的监听端口。
  • 默认值:9811
  • 取值规范:整数类型,合法的端口范围为1025到65535。
  1. --management-ip
  • 说明:设置管理服务的IP地址。
  • 默认值:"0.0.0.0"
  • 取值规范:字符串类型,合法的IP地址。
  1. --management-port
  • 说明:设置管理服务的监听端口。
  • 默认值:9811
  • 取值规范:整数类型,合法端口范围为1025到65535。
  1. --metrics-port
  • 说明:设置用于暴露指标的监听端口。
  • 默认值:9812
  • 取值规范:整数类型,合法的端口范围为1025到65535,注意不得与--management-port设为相同值。

监控运维

现在所有的日志的全部会打印至标准输出终端(一般来讲也就是屏幕),如需保存日志,需要自行重定向输出来进行保存。

从宿主机上访问容器中的日志,可以执行以下命令:

docker logs -f <container-id>

如何指定NPU卡

直接修改挂载的--device,即可指定使用哪些卡。

注意,只能挂载1/2/4/8这样的数量,不能挂载3/5/6/7这样的数量。

docker run --net=host --shm-size=1g \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci0 \
    --device=/dev/davinci2 \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/sbin:/usr/local/sbin \
    -v /path-to-weights/qwen1.5_14b_chat:/home/HwHiAiUser/Ascend/qwen1.5_14b_chat \
    mindie:1.0.RC3-800I-A2-arm64-OpenMind \
    --model /home/HwHiAiUser/Ascend/qwen1.5_14b_chat

此时便指定了服务框架将在0号和2号卡上运行。

如何在单机上启动多实例

目前支持在单机上启动多个容器,各自挂载不同设备,具体有以下几点要求:

  • 单一容器只挂载需要使用的设备,比如只想使用前两张卡:
    docker run --net=host --shm-size=1g \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci0 \
    --device=/dev/davinci1 \
    ...
  • 不能设置--ipc==host,会导致进程间通信出问题,第一个容器可以启动,第二个容器就无法启动,必须设置--shm-size=1g。
  • 多个容器之间的端口不能冲突,包括--port,--management-port和--metrics-port。

下面给出一个具体的例子,首先是第一个容器启动,使用6和7卡:

docker run --net=host --shm-size=1g \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/sbin:/usr/local/sbin \
-v /path-to-weights/qwen1.5_14b_chat:/home/HwHiAiUser/Ascend/qwen1.5_14b_chat \
mindie:1.0.RC3-800I-A2-arm64-OpenMind \
--model /home/HwHiAiUser/Ascend/qwen1.5_14b_chat
--port 9811 \
--management-port 9811 \
--metrics-port 9812

等待第一个容器启动成功后,再使用以下命令启动第二个容器,使用4和5卡:

docker run --net=host --shm-size=1g \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/sbin:/usr/local/sbin \
-v /path-to-weights/qwen1.5_14b_chat:/home/HwHiAiUser/Ascend/qwen1.5_14b_chat \
mindie:1.0.RC3-800I-A2-arm64-OpenMind \
--model /home/HwHiAiUser/Ascend/qwen1.5_14b_chat
--port 9813 \
--management-port 9813 \
--metrics-port 9814

常见问题

驱动与用户属组问题

使用本镜像需要保证“在宿主机上ID是1001的用户(默认的HwHiAiUser)可以使用设备”,也就是说需要保证ID为1001的用户(一般就是HwHiAiUser)可以执行npu-smi指令,正确识别设备。如果ID为1001的用户无法使用,需要重装驱动并添加--install-for-all参数。

若默认的HwHiAiUser用户对应的ID不为1001,如1000,则需docker启动命令中加入以下参数:--user 1001:1000

权重路径权限问题

注意保证权重路径是可用的,执行以下命令修改权限,注意是整个父级目录的权限:

chown -R HwHiAiUser:HwHiAiUser /path-to-weights
chmod -R 750 /path-to-weights

进程间通信参数问题

请优先使用--shm-size=1g参数,避免使用--ipc=host参数,已知后者可能会出现空间不足,导致多实例启动失败等问题。

服务启动失败后行为

如果想在服务启动失败后停留在容器内排查问题,可以在docker run命令后添加-it参数,添加后,如果服务启动失败,则会进入/bin/bash,方便调试。如果不添加,则默认服务启动失败后容器终止。

检查用户与权限

启动容器后,docker exec -it <container-id> bash进入容器,发现命令提示符前缀为HwHiAiUser,则证明为非root用户运行,如下:

HwHiAiUser@localhost:~$

Citation

If you find our work helpful, feel free to give us a cite.

@article{qwen,
  title={Qwen Technical Report},
  author={Jinze Bai and Shuai Bai and Yunfei Chu and Zeyu Cui and Kai Dang and Xiaodong Deng and Yang Fan and Wenbin Ge and Yu Han and Fei Huang and Binyuan Hui and Luo Ji and Mei Li and Junyang Lin and Runji Lin and Dayiheng Liu and Gao Liu and Chengqiang Lu and Keming Lu and Jianxin Ma and Rui Men and Xingzhang Ren and Xuancheng Ren and Chuanqi Tan and Sinan Tan and Jianhong Tu and Peng Wang and Shijie Wang and Wei Wang and Shengguang Wu and Benfeng Xu and Jin Xu and An Yang and Hao Yang and Jian Yang and Shusheng Yang and Yang Yao and Bowen Yu and Hongyi Yuan and Zheng Yuan and Jianwei Zhang and Xingxuan Zhang and Yichang Zhang and Zhenru Zhang and Chang Zhou and Jingren Zhou and Xiaohuan Zhou and Tianhang Zhu},
  journal={arXiv preprint arXiv:2309.16609},
  year={2023}
}