LLM 微调——InternLM(非 transformers)

发布于 2023-07-26  53 次阅读


安装

方便起见,将项目迁移到自己的 git 平台。

环境准备

为了不影响服务器上其他用户,采用源码安装到用户目录下。

GCC

参考:非root用户安装Linux gcc版本

  1. 下载包:wget http://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz
  2. 解压:tar -xzvf gcc-10.2.0.tar.gz gcc-10.2.0
  3. 依赖安装:cd gcc-10.2.0 && ./contrib/download_prerequisites
  4. 创建编译目录:mkdir gcc-build-10.2.0 && cd gcc-build-10.2.0
  5. 生成 Makefile 文件:../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
  6. 编译:make -j 18,其中 -j 参数指定了同时运行的命令数。PS.我没指定的时候只有一个核在跑,速度感人……
  7. 指定路径安装:make DESTDIR=$HOME/software/gcc-10.2.0 install

MPFR

  1. 下载包:wget https://mpfr.loria.fr/mpfr-4.1.0/mpfr-4.1.0.tar.gz
  2. 解压:tar -xzvf mpfr-4.1.0.tar.gz mpfr-4.1.0
  3. 创建编译目录:cd mpfr-4.1.0 && mkdir mpfr-build-4.1.0 && cd mpfr-build-4.1.0
  4. 生成 Makefile 文件:../configure
  5. 编译:make -j 18
  6. 安装到指定路径:make DESTDIR=$HOME/software/mpfr-4.1.0 install

cuda

下载 11.7 版本的 installer,安装到默认位置即可。如果存在多个版本的 cuda,不要创建软连接,也不用安装驱动。

对于安装多版本而言,可以使用静默安装:sh ... --toolkitpath=/target/path --toolkit --silent

cudnn

下载文件,解压,然后:

cp cudnn-8.9.2/include/cudnn.h  /usr/local/cuda-11.7/include/.
cp cudnn-8.9.2/lib/libcudnn*  /usr/local/cuda-11.7/lib64
chmod a+r /usr/local/cuda-11.7/include/cudnn.h  /usr/local/cuda-11.7/lib64/libcudnn*

环境变量配置:

export CUDA_PATH=/usr/local/cuda-11.7
export CUDA_HOME=/usr/local/cuda-11.7
export GCC_HOME=$HOME/software/gcc-10.2.0/usr/local
export MPFR_HOME=$HOME/software/mpfr-4.1.0/usr/local
export LD_LIBRARY_PATH=${GCC_HOME}/lib64:${MPFR_HOME}/lib:${CUDA_PATH}/lib64:$LD_LIBRARY_PATH
export PATH=${GCC_HOME}/bin:${CUDA_PATH}/bin:$PATH
export CC=${GCC_HOME}/bin/gcc
export CXX=${GCC_HOME}/bin/c++

环境安装

  1. 克隆仓库:git clone ...,然后进入仓库目录下
  2. 改写子模块地址以使用加速,在 .gitmodules 文件中
  3. 初始化子模块:git submodule init
  4. 拉取子模块:git submodule update
  5. 修改子模块中的子模块配置,同上 2,在子模块目录中改写 .gitmodules 文件
  6. 创建 conda 环境:
    conda create --name internlm-env python=3.10 -y
    conda activate internlm-env
    pip install -r requirements/torch.txt
    pip install -r requirements/runtime.txt
  7. 安装 flash-attention (version v1.0.5):
    cd ./third_party/flash-attention
    python setup.py install
    cd ./csrc
    cd fused_dense_lib && pip install -v .
    cd ../xentropy && pip install -v .
    cd ../rotary && pip install -v .
    cd ../layer_norm && pip install -v .
    cd ../../../../
  8. 安装 Apex (version 23.05):
    cd ./third_party/apex
    pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
    cd ../../

数据准备(微调)

这部分不难,只要参考 tools/alpaca_tokenizer.py 编写脚本,将数据集处理、输出为 .bin.meta 的数据文件。

然后:

python tools/your_tokenizer.py /path/to/your_dataset /path/to/output_dataset /path/to/tokenizer --split_ratio 0.1

其中 /path/to/tokenizer 一般为 tools/V7_sft.model,没有特殊需求的话使用这个即可。

数据集格式说明

参考项目指南数据准备(预训练)部分。

训练配置

项目指南训练配置部分。

注意,原始模型参数从 README 的 Model Zoo 部分的 OpenXLab 链接下载。

启动训练

torchrun --nnodes=1 --nproc_per_node=8 train.py --config ./configs/7B_sft.py --launcher "torch"