Loading

XTuner 微调 LLM实操-书生浦语大模型实战营第二期第4节作业

这一作业中提及的解释比较少,更多的只是一些步骤截图。这是因为教程中已经提及了几乎所有的细节信息,没有什么需要补充的。这个页面相较于官方教程的部分解释得过于详细的内容甚至是有所删减的。比如关于文件路径可视化的步骤。如果有需要,请翻阅官方教程

作业要求

基础作业(结营必做)

  • 训练自己的小助手认知

进阶作业

  • 将自我认知的模型上传到 OpenXLab,并将应用部署到 OpenXLab(优秀学员必做)
  • 复现多模态微调(优秀学员必做)

训练自己的小助手

环境搭建

首先新建空环境:

点击查看空环境带的软件包
# packages in environment at /root/.conda/envs/xtuner0.1.17
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main    defaults
_openmp_mutex             5.1                       1_gnu    defaults
asttokens                 2.4.1                    pypi_0    pypi
blas                      1.0                         mkl    defaults
brotli-python             1.0.9           py310h6a678d5_7    defaults
bzip2                     1.0.8                h7b6447c_0    defaults
ca-certificates           2023.08.22           h06a4308_0    defaults
certifi                   2023.11.17      py310h06a4308_0    defaults
cffi                      1.16.0          py310h5eee18b_0    defaults
charset-normalizer        2.0.4              pyhd3eb1b0_0    defaults
comm                      0.2.2                    pypi_0    pypi
cryptography              41.0.3          py310hdda0065_0    defaults
cuda-cudart               11.7.99                       0    nvidia
cuda-cupti                11.7.101                      0    nvidia
cuda-libraries            11.7.1                        0    nvidia
cuda-nvrtc                11.7.99                       0    nvidia
cuda-nvtx                 11.7.91                       0    nvidia
cuda-runtime              11.7.1                        0    nvidia
debugpy                   1.8.1                    pypi_0    pypi
decorator                 5.1.1                    pypi_0    pypi
exceptiongroup            1.2.0                    pypi_0    pypi
executing                 2.0.1                    pypi_0    pypi
ffmpeg                    4.3                  hf484d3e_0    pytorch
filelock                  3.13.1          py310h06a4308_0    defaults
freetype                  2.12.1               h4a9f257_0    defaults
giflib                    5.2.1                h5eee18b_3    defaults
gmp                       6.2.1                h295c915_3    defaults
gmpy2                     2.1.2           py310heeb90bb_0    defaults
gnutls                    3.6.15               he1e5248_0    defaults
idna                      3.4             py310h06a4308_0    defaults
intel-openmp              2023.1.0         hdb19cb5_46306    defaults
ipykernel                 6.29.4                   pypi_0    pypi
ipython                   8.23.0                   pypi_0    pypi
jedi                      0.19.1                   pypi_0    pypi
jinja2                    3.1.2           py310h06a4308_0    defaults
jpeg                      9e                   h5eee18b_1    defaults
jupyter-client            8.6.1                    pypi_0    pypi
jupyter-core              5.7.2                    pypi_0    pypi
lame                      3.100                h7b6447c_0    defaults
lcms2                     2.12                 h3be6417_0    defaults
ld_impl_linux-64          2.38                 h1181459_1    defaults
lerc                      3.0                  h295c915_0    defaults
libcublas                 11.10.3.66                    0    nvidia
libcufft                  10.7.2.124           h4fbf590_0    nvidia
libcufile                 1.8.1.2                       0    nvidia
libcurand                 10.3.4.101                    0    nvidia
libcusolver               11.4.0.1                      0    nvidia
libcusparse               11.7.4.91                     0    nvidia
libdeflate                1.17                 h5eee18b_1    defaults
libffi                    3.4.4                h6a678d5_0    defaults
libgcc-ng                 11.2.0               h1234567_1    defaults
libgomp                   11.2.0               h1234567_1    defaults
libiconv                  1.16                 h7f8727e_2    defaults
libidn2                   2.3.4                h5eee18b_0    defaults
libnpp                    11.7.4.75                     0    nvidia
libnvjpeg                 11.8.0.2                      0    nvidia
libpng                    1.6.39               h5eee18b_0    defaults
libstdcxx-ng              11.2.0               h1234567_1    defaults
libtasn1                  4.19.0               h5eee18b_0    defaults
libtiff                   4.5.1                h6a678d5_0    defaults
libunistring              0.9.10               h27cfd23_0    defaults
libuuid                   1.41.5               h5eee18b_0    defaults
libwebp                   1.3.2                h11a3e52_0    defaults
libwebp-base              1.3.2                h5eee18b_0    defaults
lz4-c                     1.9.4                h6a678d5_0    defaults
markupsafe                2.1.1           py310h7f8727e_0    defaults
matplotlib-inline         0.1.6                    pypi_0    pypi
mkl                       2023.1.0         h213fc3f_46344    defaults
mkl-service               2.4.0           py310h5eee18b_1    defaults
mkl_fft                   1.3.8           py310h5eee18b_0    defaults
mkl_random                1.2.4           py310hdb19cb5_0    defaults
mpc                       1.1.0                h10f8cd9_1    defaults
mpfr                      4.0.2                hb69a4c5_1    defaults
mpmath                    1.3.0           py310h06a4308_0    defaults
ncurses                   6.4                  h6a678d5_0    defaults
nest-asyncio              1.6.0                    pypi_0    pypi
nettle                    3.7.3                hbbd107a_1    defaults
networkx                  3.1             py310h06a4308_0    defaults
numpy                     1.26.2          py310h5f9d8c6_0    defaults
numpy-base                1.26.2          py310hb5e798b_0    defaults
openh264                  2.1.1                h4ff587b_0    defaults
openjpeg                  2.4.0                h3ad879b_0    defaults
openssl                   3.0.12               h7f8727e_0    defaults
packaging                 24.0                     pypi_0    pypi
parso                     0.8.4                    pypi_0    pypi
pexpect                   4.9.0                    pypi_0    pypi
pillow                    10.0.1          py310ha6cbd5a_0    defaults
pip                       23.3.1          py310h06a4308_0    defaults
platformdirs              4.2.0                    pypi_0    pypi
prompt-toolkit            3.0.43                   pypi_0    pypi
psutil                    5.9.8                    pypi_0    pypi
ptyprocess                0.7.0                    pypi_0    pypi
pure-eval                 0.2.2                    pypi_0    pypi
pycparser                 2.21               pyhd3eb1b0_0    defaults
pygments                  2.17.2                   pypi_0    pypi
pyopenssl                 23.2.0          py310h06a4308_0    defaults
pysocks                   1.7.1           py310h06a4308_0    defaults
python                    3.10.13              h955ad1f_0    defaults
python-dateutil           2.9.0.post0              pypi_0    pypi
pytorch                   2.0.1           py3.10_cuda11.7_cudnn8.5.0_0    pytorch
pytorch-cuda              11.7                 h778d358_5    pytorch
pytorch-mutex             1.0                        cuda    pytorch
pyzmq                     25.1.2                   pypi_0    pypi
readline                  8.2                  h5eee18b_0    defaults
requests                  2.31.0          py310h06a4308_0    defaults
setuptools                68.0.0          py310h06a4308_0    defaults
six                       1.16.0                   pypi_0    pypi
sqlite                    3.41.2               h5eee18b_0    defaults
stack-data                0.6.3                    pypi_0    pypi
sympy                     1.11.1          py310h06a4308_0    defaults
tbb                       2021.8.0             hdb19cb5_0    defaults
tk                        8.6.12               h1ccaba5_0    defaults
torchaudio                2.0.2               py310_cu117    pytorch
torchtriton               2.0.0                     py310    pytorch
torchvision               0.15.2              py310_cu117    pytorch
tornado                   6.4                      pypi_0    pypi
traitlets                 5.14.2                   pypi_0    pypi
typing_extensions         4.7.1           py310h06a4308_0    defaults
tzdata                    2023c                h04d1e81_0    defaults
urllib3                   1.26.18         py310h06a4308_0    defaults
wcwidth                   0.2.13                   pypi_0    pypi
wheel                     0.41.2          py310h06a4308_0    defaults
xz                        5.4.2                h5eee18b_0    defaults
zlib                      1.2.13               h5eee18b_0    defaults
zstd                      1.5.5                hc292b87_0    defaults
studio-conda xtuner0.1.17
conda activate xtuner0.1.17

然后安装xtuner库:

cd ~
mkdir -p /root/xtuner0117 && cd /root/xtuner0117
git clone -b v0.1.17  https://github.com/InternLM/xtuner
cd /root/xtuner0117/xtuner
pip install -e '.[all]'

我这一步实际上是出现报错了的:

  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [0 lines of output]
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

点击查看安装失败后环境内的软件包 ``` # packages in environment at /root/.conda/envs/xtuner0.1.17: # # Name Version Build Channel _libgcc_mutex 0.1 main defaults _openmp_mutex 5.1 1_gnu defaults asttokens 2.4.1 pypi_0 pypi blas 1.0 mkl defaults brotli-python 1.0.9 py310h6a678d5_7 defaults bzip2 1.0.8 h7b6447c_0 defaults ca-certificates 2023.08.22 h06a4308_0 defaults certifi 2023.11.17 py310h06a4308_0 defaults cffi 1.16.0 py310h5eee18b_0 defaults charset-normalizer 2.0.4 pyhd3eb1b0_0 defaults comm 0.2.2 pypi_0 pypi cryptography 41.0.3 py310hdda0065_0 defaults cuda-cudart 11.7.99 0 nvidia cuda-cupti 11.7.101 0 nvidia cuda-libraries 11.7.1 0 nvidia cuda-nvrtc 11.7.99 0 nvidia cuda-nvtx 11.7.91 0 nvidia cuda-runtime 11.7.1 0 nvidia debugpy 1.8.1 pypi_0 pypi decorator 5.1.1 pypi_0 pypi exceptiongroup 1.2.0 pypi_0 pypi executing 2.0.1 pypi_0 pypi ffmpeg 4.3 hf484d3e_0 pytorch filelock 3.13.1 py310h06a4308_0 defaults freetype 2.12.1 h4a9f257_0 defaults giflib 5.2.1 h5eee18b_3 defaults gmp 6.2.1 h295c915_3 defaults gmpy2 2.1.2 py310heeb90bb_0 defaults gnutls 3.6.15 he1e5248_0 defaults idna 3.4 py310h06a4308_0 defaults intel-openmp 2023.1.0 hdb19cb5_46306 defaults ipykernel 6.29.4 pypi_0 pypi ipython 8.23.0 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 py310h06a4308_0 defaults jpeg 9e h5eee18b_1 defaults jupyter-client 8.6.1 pypi_0 pypi jupyter-core 5.7.2 pypi_0 pypi lame 3.100 h7b6447c_0 defaults lcms2 2.12 h3be6417_0 defaults ld_impl_linux-64 2.38 h1181459_1 defaults lerc 3.0 h295c915_0 defaults libcublas 11.10.3.66 0 nvidia libcufft 10.7.2.124 h4fbf590_0 nvidia libcufile 1.8.1.2 0 nvidia libcurand 10.3.4.101 0 nvidia libcusolver 11.4.0.1 0 nvidia libcusparse 11.7.4.91 0 nvidia libdeflate 1.17 h5eee18b_1 defaults libffi 3.4.4 h6a678d5_0 defaults libgcc-ng 11.2.0 h1234567_1 defaults libgomp 11.2.0 h1234567_1 defaults libiconv 1.16 h7f8727e_2 defaults libidn2 2.3.4 h5eee18b_0 defaults libnpp 11.7.4.75 0 nvidia libnvjpeg 11.8.0.2 0 nvidia libpng 1.6.39 h5eee18b_0 defaults libstdcxx-ng 11.2.0 h1234567_1 defaults libtasn1 4.19.0 h5eee18b_0 defaults libtiff 4.5.1 h6a678d5_0 defaults libunistring 0.9.10 h27cfd23_0 defaults libuuid 1.41.5 h5eee18b_0 defaults libwebp 1.3.2 h11a3e52_0 defaults libwebp-base 1.3.2 h5eee18b_0 defaults lz4-c 1.9.4 h6a678d5_0 defaults markupsafe 2.1.1 py310h7f8727e_0 defaults matplotlib-inline 0.1.6 pypi_0 pypi mkl 2023.1.0 h213fc3f_46344 defaults mkl-service 2.4.0 py310h5eee18b_1 defaults mkl_fft 1.3.8 py310h5eee18b_0 defaults mkl_random 1.2.4 py310hdb19cb5_0 defaults mpc 1.1.0 h10f8cd9_1 defaults mpfr 4.0.2 hb69a4c5_1 defaults mpmath 1.3.0 py310h06a4308_0 defaults ncurses 6.4 h6a678d5_0 defaults nest-asyncio 1.6.0 pypi_0 pypi nettle 3.7.3 hbbd107a_1 defaults networkx 3.1 py310h06a4308_0 defaults numpy 1.26.2 py310h5f9d8c6_0 defaults numpy-base 1.26.2 py310hb5e798b_0 defaults openh264 2.1.1 h4ff587b_0 defaults openjpeg 2.4.0 h3ad879b_0 defaults openssl 3.0.12 h7f8727e_0 defaults packaging 24.0 pypi_0 pypi parso 0.8.4 pypi_0 pypi pexpect 4.9.0 pypi_0 pypi pillow 10.0.1 py310ha6cbd5a_0 defaults pip 23.3.1 py310h06a4308_0 defaults platformdirs 4.2.0 pypi_0 pypi prompt-toolkit 3.0.43 pypi_0 pypi psutil 5.9.8 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi pycparser 2.21 pyhd3eb1b0_0 defaults pygments 2.17.2 pypi_0 pypi pyopenssl 23.2.0 py310h06a4308_0 defaults pysocks 1.7.1 py310h06a4308_0 defaults python 3.10.13 h955ad1f_0 defaults python-dateutil 2.9.0.post0 pypi_0 pypi pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0 pytorch pytorch-cuda 11.7 h778d358_5 pytorch pytorch-mutex 1.0 cuda pytorch pyzmq 25.1.2 pypi_0 pypi readline 8.2 h5eee18b_0 defaults requests 2.31.0 py310h06a4308_0 defaults setuptools 68.0.0 py310h06a4308_0 defaults six 1.16.0 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 defaults stack-data 0.6.3 pypi_0 pypi sympy 1.11.1 py310h06a4308_0 defaults tbb 2021.8.0 hdb19cb5_0 defaults tk 8.6.12 h1ccaba5_0 defaults torchaudio 2.0.2 py310_cu117 pytorch torchtriton 2.0.0 py310 pytorch torchvision 0.15.2 py310_cu117 pytorch tornado 6.4 pypi_0 pypi traitlets 5.14.2 pypi_0 pypi typing_extensions 4.7.1 py310h06a4308_0 defaults tzdata 2023c h04d1e81_0 defaults urllib3 1.26.18 py310h06a4308_0 defaults wcwidth 0.2.13 pypi_0 pypi wheel 0.41.2 py310h06a4308_0 defaults xz 5.4.2 h5eee18b_0 defaults zlib 1.2.13 h5eee18b_0 defaults zstd 1.5.5 hc292b87_0 defaults ```

后面在设置配置文件的时候意识到自己xtuner没装上,然后重启了一次开发机,莫名其妙又可以装上了:

点击查看安装成功后环境内的软件包 ``` # packages in environment at /root/.conda/envs/xtuner0.1.17: # # Name Version Build Channel _libgcc_mutex 0.1 main defaults _openmp_mutex 5.1 1_gnu defaults accelerate 0.29.2 pypi_0 pypi addict 2.4.0 pypi_0 pypi aiohttp 3.9.4 pypi_0 pypi aiosignal 1.3.1 pypi_0 pypi aliyun-python-sdk-core 2.15.0 pypi_0 pypi aliyun-python-sdk-kms 2.16.2 pypi_0 pypi altair 5.3.0 pypi_0 pypi annotated-types 0.6.0 pypi_0 pypi anyio 4.3.0 pypi_0 pypi argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi arxiv 2.1.0 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi async-lru 2.0.4 pypi_0 pypi async-timeout 4.0.3 pypi_0 pypi attrs 23.2.0 pypi_0 pypi babel 2.14.0 pypi_0 pypi beautifulsoup4 4.12.3 pypi_0 pypi bitsandbytes 0.43.1 pypi_0 pypi blas 1.0 mkl defaults bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi brotli-python 1.0.9 py310h6a678d5_7 defaults bzip2 1.0.8 h7b6447c_0 defaults ca-certificates 2023.08.22 h06a4308_0 defaults cachetools 5.3.3 pypi_0 pypi certifi 2023.11.17 py310h06a4308_0 defaults cffi 1.16.0 py310h5eee18b_0 defaults charset-normalizer 2.0.4 pyhd3eb1b0_0 defaults click 8.1.7 pypi_0 pypi colorama 0.4.6 pypi_0 pypi comm 0.2.2 pypi_0 pypi contourpy 1.2.1 pypi_0 pypi crcmod 1.7 pypi_0 pypi cryptography 41.0.3 py310hdda0065_0 defaults cuda-cudart 11.7.99 0 nvidia cuda-cupti 11.7.101 0 nvidia cuda-libraries 11.7.1 0 nvidia cuda-nvrtc 11.7.99 0 nvidia cuda-nvtx 11.7.91 0 nvidia cuda-runtime 11.7.1 0 nvidia cycler 0.12.1 pypi_0 pypi datasets 2.18.0 pypi_0 pypi debugpy 1.8.1 pypi_0 pypi decorator 5.1.1 pypi_0 pypi deepspeed 0.14.0 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dill 0.3.8 pypi_0 pypi distro 1.9.0 pypi_0 pypi einops 0.7.0 pypi_0 pypi et-xmlfile 1.1.0 pypi_0 pypi exceptiongroup 1.2.0 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastjsonschema 2.19.1 pypi_0 pypi feedparser 6.0.10 pypi_0 pypi ffmpeg 4.3 hf484d3e_0 pytorch filelock 3.13.1 py310h06a4308_0 defaults fonttools 4.51.0 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi freetype 2.12.1 h4a9f257_0 defaults frozenlist 1.4.1 pypi_0 pypi fsspec 2024.2.0 pypi_0 pypi func-timeout 4.3.5 pypi_0 pypi gast 0.5.4 pypi_0 pypi giflib 5.2.1 h5eee18b_3 defaults gitdb 4.0.11 pypi_0 pypi gitpython 3.1.43 pypi_0 pypi gmp 6.2.1 h295c915_3 defaults gmpy2 2.1.2 py310heeb90bb_0 defaults gnutls 3.6.15 he1e5248_0 defaults griffe 0.42.1 pypi_0 pypi h11 0.14.0 pypi_0 pypi hjson 3.1.0 pypi_0 pypi httpcore 1.0.5 pypi_0 pypi httpx 0.27.0 pypi_0 pypi huggingface-hub 0.22.2 pypi_0 pypi idna 3.4 py310h06a4308_0 defaults imageio 2.34.0 pypi_0 pypi importlib-metadata 7.1.0 pypi_0 pypi intel-openmp 2023.1.0 hdb19cb5_46306 defaults ipykernel 6.29.4 pypi_0 pypi ipython 8.23.0 pypi_0 pypi ipywidgets 8.1.2 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 py310h06a4308_0 defaults jmespath 0.10.0 pypi_0 pypi jpeg 9e h5eee18b_1 defaults json5 0.9.25 pypi_0 pypi jsonpointer 2.4 pypi_0 pypi jsonschema 4.21.1 pypi_0 pypi jsonschema-specifications 2023.12.1 pypi_0 pypi jupyter 1.0.0 pypi_0 pypi jupyter-client 8.6.1 pypi_0 pypi jupyter-console 6.6.3 pypi_0 pypi jupyter-core 5.7.2 pypi_0 pypi jupyter-events 0.10.0 pypi_0 pypi jupyter-lsp 2.2.5 pypi_0 pypi jupyter-server 2.14.0 pypi_0 pypi jupyter-server-terminals 0.5.3 pypi_0 pypi jupyterlab 4.1.6 pypi_0 pypi jupyterlab-pygments 0.3.0 pypi_0 pypi jupyterlab-server 2.26.0 pypi_0 pypi jupyterlab-widgets 3.0.10 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi lagent 0.2.2 pypi_0 pypi lame 3.100 h7b6447c_0 defaults lazy-loader 0.4 pypi_0 pypi lcms2 2.12 h3be6417_0 defaults ld_impl_linux-64 2.38 h1181459_1 defaults lerc 3.0 h295c915_0 defaults libcublas 11.10.3.66 0 nvidia libcufft 10.7.2.124 h4fbf590_0 nvidia libcufile 1.8.1.2 0 nvidia libcurand 10.3.4.101 0 nvidia libcusolver 11.4.0.1 0 nvidia libcusparse 11.7.4.91 0 nvidia libdeflate 1.17 h5eee18b_1 defaults libffi 3.4.4 h6a678d5_0 defaults libgcc-ng 11.2.0 h1234567_1 defaults libgomp 11.2.0 h1234567_1 defaults libiconv 1.16 h7f8727e_2 defaults libidn2 2.3.4 h5eee18b_0 defaults libnpp 11.7.4.75 0 nvidia libnvjpeg 11.8.0.2 0 nvidia libpng 1.6.39 h5eee18b_0 defaults libstdcxx-ng 11.2.0 h1234567_1 defaults libtasn1 4.19.0 h5eee18b_0 defaults libtiff 4.5.1 h6a678d5_0 defaults libunistring 0.9.10 h27cfd23_0 defaults libuuid 1.41.5 h5eee18b_0 defaults libwebp 1.3.2 h11a3e52_0 defaults libwebp-base 1.3.2 h5eee18b_0 defaults lz4-c 1.9.4 h6a678d5_0 defaults markdown-it-py 3.0.0 pypi_0 pypi markupsafe 2.1.1 py310h7f8727e_0 defaults matplotlib 3.8.4 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mdurl 0.1.2 pypi_0 pypi mistune 3.0.2 pypi_0 pypi mkl 2023.1.0 h213fc3f_46344 defaults mkl-service 2.4.0 py310h5eee18b_1 defaults mkl_fft 1.3.8 py310h5eee18b_0 defaults mkl_random 1.2.4 py310hdb19cb5_0 defaults mmengine 0.10.3 pypi_0 pypi modelscope 1.13.3 pypi_0 pypi mpc 1.1.0 h10f8cd9_1 defaults mpfr 4.0.2 hb69a4c5_1 defaults mpi4py-mpich 3.1.5 pypi_0 pypi mpmath 1.3.0 py310h06a4308_0 defaults multidict 6.0.5 pypi_0 pypi multiprocess 0.70.16 pypi_0 pypi nbclient 0.10.0 pypi_0 pypi nbconvert 7.16.3 pypi_0 pypi nbformat 5.10.4 pypi_0 pypi ncurses 6.4 h6a678d5_0 defaults nest-asyncio 1.6.0 pypi_0 pypi nettle 3.7.3 hbbd107a_1 defaults networkx 3.1 py310h06a4308_0 defaults ninja 1.11.1.1 pypi_0 pypi notebook 7.1.2 pypi_0 pypi notebook-shim 0.2.4 pypi_0 pypi numpy 1.26.2 py310h5f9d8c6_0 defaults numpy-base 1.26.2 py310hb5e798b_0 defaults opencv-python 4.9.0.80 pypi_0 pypi openh264 2.1.1 h4ff587b_0 defaults openjpeg 2.4.0 h3ad879b_0 defaults openpyxl 3.1.2 pypi_0 pypi openssl 3.0.12 h7f8727e_0 defaults oss2 2.18.4 pypi_0 pypi overrides 7.7.0 pypi_0 pypi packaging 24.0 pypi_0 pypi pandas 2.2.2 pypi_0 pypi pandocfilters 1.5.1 pypi_0 pypi parso 0.8.4 pypi_0 pypi peft 0.10.0 pypi_0 pypi pexpect 4.9.0 pypi_0 pypi phx-class-registry 4.1.0 pypi_0 pypi pillow 10.0.1 py310ha6cbd5a_0 defaults pip 23.3.1 py310h06a4308_0 defaults platformdirs 4.2.0 pypi_0 pypi prometheus-client 0.20.0 pypi_0 pypi prompt-toolkit 3.0.43 pypi_0 pypi protobuf 4.25.3 pypi_0 pypi psutil 5.9.8 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-cpuinfo 9.0.0 pypi_0 pypi pyarrow 15.0.2 pypi_0 pypi pyarrow-hotfix 0.6 pypi_0 pypi pycparser 2.21 pyhd3eb1b0_0 defaults pycryptodome 3.20.0 pypi_0 pypi pydantic 2.7.0 pypi_0 pypi pydantic-core 2.18.1 pypi_0 pypi pydeck 0.8.1b0 pypi_0 pypi pygments 2.17.2 pypi_0 pypi pynvml 11.5.0 pypi_0 pypi pyopenssl 23.2.0 py310h06a4308_0 defaults pyparsing 3.1.2 pypi_0 pypi pysocks 1.7.1 py310h06a4308_0 defaults python 3.10.13 h955ad1f_0 defaults python-dateutil 2.9.0.post0 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0 pytorch pytorch-cuda 11.7 h778d358_5 pytorch pytorch-mutex 1.0 cuda pytorch pytz 2024.1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 25.1.2 pypi_0 pypi qtconsole 5.5.1 pypi_0 pypi qtpy 2.4.1 pypi_0 pypi readline 8.2 h5eee18b_0 defaults referencing 0.34.0 pypi_0 pypi regex 2023.12.25 pypi_0 pypi requests 2.31.0 py310h06a4308_0 defaults rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rich 13.7.1 pypi_0 pypi rpds-py 0.18.0 pypi_0 pypi safetensors 0.4.2 pypi_0 pypi scikit-image 0.23.1 pypi_0 pypi scipy 1.13.0 pypi_0 pypi send2trash 1.8.3 pypi_0 pypi sentencepiece 0.2.0 pypi_0 pypi setuptools 68.0.0 py310h06a4308_0 defaults sgmllib3k 1.0.0 pypi_0 pypi simplejson 3.19.2 pypi_0 pypi six 1.16.0 pypi_0 pypi smmap 5.0.1 pypi_0 pypi sniffio 1.3.1 pypi_0 pypi sortedcontainers 2.4.0 pypi_0 pypi soupsieve 2.5 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 defaults stack-data 0.6.3 pypi_0 pypi streamlit 1.33.0 pypi_0 pypi sympy 1.11.1 py310h06a4308_0 defaults tbb 2021.8.0 hdb19cb5_0 defaults tenacity 8.2.3 pypi_0 pypi termcolor 2.4.0 pypi_0 pypi terminado 0.18.1 pypi_0 pypi tifffile 2024.2.12 pypi_0 pypi tiktoken 0.6.0 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 defaults tokenizers 0.15.2 pypi_0 pypi toml 0.10.2 pypi_0 pypi tomli 2.0.1 pypi_0 pypi toolz 0.12.1 pypi_0 pypi torchaudio 2.0.2 py310_cu117 pytorch torchtriton 2.0.0 py310 pytorch torchvision 0.15.2 py310_cu117 pytorch tornado 6.4 pypi_0 pypi tqdm 4.66.2 pypi_0 pypi traitlets 5.14.2 pypi_0 pypi transformers 4.39.3 pypi_0 pypi transformers-stream-generator 0.0.5 pypi_0 pypi types-python-dateutil 2.9.0.20240316 pypi_0 pypi typing_extensions 4.7.1 py310h06a4308_0 defaults tzdata 2024.1 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py310h06a4308_0 defaults watchdog 4.0.0 pypi_0 pypi wcwidth 0.2.13 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.7.0 pypi_0 pypi wheel 0.41.2 py310h06a4308_0 defaults widgetsnbextension 4.0.10 pypi_0 pypi xtuner 0.1.17 dev_0 xxhash 3.4.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 defaults yapf 0.40.2 pypi_0 pypi yarl 1.9.4 pypi_0 pypi zipp 3.18.1 pypi_0 pypi zlib 1.2.13 h5eee18b_0 defaults zstd 1.5.5 hc292b87_0 defaults ```

最后准备模型:

mkdir -p /root/ft/model
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ft/model

这一步执行完成之后,文件结构如下图:

数据集准备

mkdir -p /root/ft && cd /root/ft
mkdir -p /root/ft/data && cd /root/ft/data
touch /root/ft/data/generate_data.py

创建 /root/ft/data/generate_data.py 文件:

import json

name = 'hpbtql'  # 这里改成你的名字
n =  10000  # 设置需要重复添加的数据次数

data = [
    {
        "messages": [
            {
                "role": "user",
                "content": "请做一下自我介绍"
            },
            {
                "role": "assistant",
                "content": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)
            }
        ]
    }
]

for i in range(n):
    data.append(data[0])

with open('personal_assistant.json', 'w', encoding='utf-8') as f:
    # 使用json.dump方法将数据以JSON格式写入文件;ensure_ascii=False 确保中文字符正常显示;indent=4 使得文件内容格式化,便于阅读
    json.dump(data, f, ensure_ascii=False, indent=4)

运行 generate_data.py

cd /root/ft/data
python /root/ft/data/generate_data.py

在data的路径下便生成了一个名为 personal_assistant.json 的文件。

设置配置文件

复制xtuner提供的配置文件

使用 XTuner 中的 copy-cfg 功能将 config 文件复制到指定的位置:

mkdir -p /root/ft/config
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config

该命令有两个必填参数: {CONFIG_NAME}{SAVE_PATH}{CONFIG_NAME} 可以使用xtuner list-cfg查找:

xtuner list-cfg -p internlm2_1_8b # -p表pattern

输出为:

image

解释是:

模型名 说明
internlm2_1_8b 模型名称
qlora 使用的算法
alpaca 数据集名称
e3 把数据集跑3次

{SAVE_PATH} 则对应的是使用mkdir新建的 /root/ft/config。我们假如需要复制其他的配置文件只需要修改这两个参数即可实现。

如果遇到bash: xtuner: command not found,请重新安装xutner。具体请参照避坑指南

修改配置文件

我们直接修改/root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py

修改第27行的预训练模型位置、第31行数据集的位置;修改第33行的max_length来降低显存的消耗,修改第44行的max_epochs减少训练的轮数;修改第57行的评估频率和第:

# 模型与数据位置
# 这里要注意`pretrained_model_name_or_path`下面到底有没有模型。也就是你在模型下载这里模型到底在哪里。
# 否则会报OSError: /root/ft/model does not appear to have a file named config.json. Checkout 'https://huggingface.co//root/ft/model/tree/None' for available files.
# 教程上直接是'/root/ft/model',但是我这前面link到了'/root/ft/model/internlm2-chat-1_8b',所以进行了改动。
sed -i "27s#.*#pretrained_model_name_or_path = '/root/ft/model/internlm2-chat-1_8b'#"#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "31s#.*#alpaca_en_path = '/root/ft/data/personal_assistant.json'#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py

# 节省训练资源
sed -i "33s#.*#max_length = 1024#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "44s#.*#max_epochs = 2#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py

# evaluation相关
sed -i "54s#.*#save_total_limit = 3#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "57s#.*#evaluation_freq = 300#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "60s#.*#'请你介绍一下你自己', '你是谁', '你是我的小助手吗'#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py

# 数据集加载格式
sed -i "15s#.*#from xtuner.dataset.map_fns import openai_map_fn, template_map_fn_factory" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "102s#.*#dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path))," /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
sed -i "105s#.*#dataset_map_fn=openai_map_fn,#" /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py

有一说一,Java学久了以后感觉这玩意得封装成配置类,之后通过控制反转的方式设置这些配置。还有异常处理必须做好、做得人性化。
在Python里面,可以使用@dataclass注解装饰器,如:

@dataclass
class GPTConfig:
    block_size: int = 1024
    vocab_size: int = 50257
    n_layer: int = 12
    n_head: int = 12
    n_embd: int = 768

模型训练

使用 xtuner train 指令开始训练:

# 指定保存路径为`/root/ft/train`
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train

这里使用的算力还是比较小的。猜测是一个访存密集的任务,GPU时常空转,显存占4G:

image

所以我也没上DeepSpeed。如有必要,可以使用以下命令调用DeepSpeed:

xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train_deepspeed --deepspeed deepspeed_zero2

在输入训练完后的文件如下所示:

|-- train/
    |-- internlm2_1_8b_qlora_alpaca_e3_copy.py
    |-- iter_600.pth
    |-- last_checkpoint
    |-- iter_768.pth
    |-- iter_300.pth
    |-- 20240406_203957/
        |-- 20240406_203957.log
        |-- vis_data/
            |-- 20240406_203957.json
            |-- eval_outputs_iter_599.txt
            |-- eval_outputs_iter_767.txt
            |-- scalars.json
            |-- eval_outputs_iter_299.txt
            |-- config.py

当然也可以使用 deepspeed 来加速训练:

# 使用 deepspeed 来加速训练
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train_deepspeed --deepspeed deepspeed_zero2

假如我们的模型训练过程中突然被中断了,我们也可以通过在原有指令的基础上加上 --resume {checkpoint_path} 来实现模型的继续训练:

# 模型续训
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train --resume /root/ft/train/iter_600.pth

模型转换

模型转换就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,那么我们可以通过xtuner convert来实现一键转换。

训练完成后,我们注意看模型保存位置:

image

那么,我们的模型在/root/ft/train/iter_64.pth下,那么,我们的命令就是:

mkdir -p /root/ft/huggingface

# xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}
xtuner convert pth_to_hf /root/ft/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train/iter_64.pth /root/ft/huggingface --fp32 --max-shard-size 2GB

这里的命令不能照抄,要自己把权重文件地址改成自己的,否则会报FileNotFoundError: Cannot find /root/ft/train/iter_64.pth

转换完成后,转换后模型保存地址下面会有转换的模型,这就是我们平时所理解的所谓 “LoRA 模型文件”。可以简单理解:LoRA 模型文件 = Adapter

image

模型整合

这一步不是必须的。

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的adapter,最终还是要与原模型进行组合才能被正常的使用。而对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 adapter ,因此是不需要进行模型整合的。

在 XTuner 中也是提供了一键整合的指令,但是在使用前我们需要准备好三个地址,包括原模型的地址、训练好的 adapter 层的地址(转为 Huggingface 格式后保存的部分)以及最终保存的地址。

mkdir -p /root/ft/final_model

# 解决一下线程冲突的 Bug 
export MKL_SERVICE_FORCE_INTEL=1

# 进行模型整合
# xtuner convert merge  ${NAME_OR_PATH_TO_LLM} ${NAME_OR_PATH_TO_ADAPTER} ${SAVE_PATH} 
xtuner convert merge /root/ft/model/internlm2-chat-1_8b /root/ft/huggingface /root/ft/final_model

和上面一样涉及原模型地址,一样要检查你的路径和我的是不是一样都是/root/ft/model/internlm2-chat-1_8b或者教程里写的/root/ft/model

模型推理

使用命令行xtuner chat命令与模型进行对话。如果你的模型已经整合过了,可以直接执行

xtuner chat /root/ft/final_model --prompt-template internlm2_chat

如果没有整合,可以使用 --adapter 参数与完整的模型进行对话

xtuner chat /root/ft/model --adapter /root/ft/huggingface --prompt-template internlm2_chat

这个命令可以不进行整合,从而测试和挑选我们的adapter

执行后发现,模型对于我们预先准备的几个问题是过拟合的:

与先前在飞书上搭建的RAG进行比较,灵活度是不高的。Finetune后的模型只会输出我们训练集里面的那一句话。但是RAG这个模型的输出与原始的Interm一致:

image

发现微调之后的模型泛化能力缺失。当然大模型时代大家好像更喜欢称这个东西为模型的“通用能力”。

避坑指南

bash: xtuner: command not found

xtuner问题描述

在执行命令时出现报错bash: xtuner: command not found

xtuner解决方案

出现这个问题,请重新安装xtuner。并且确保安装的结尾不是如图所示的报错:

随意替换数据集

随意替换数据集问题描述

模型推理时无法按训练数据进行回答

随意替换数据集解决方案

数据集准备这一小节中,改个名字差不多得了。如果改得太厉害模型就是会训练失败的。我试过下面的例子:

/root/ft/data/generate_data.py

import json

# 设置需要重复添加的数据次数
n =  1000

data = [
    {
        "messages": [
            {
                "role": "user",
                "content": "请做一下自我介绍"
            },
            {
                "role": "assistant",
                "content": "我是阿草,是哈哈哈的私人助手。内在是百度文心一言哦"
            }
        ]
    }
]

for i in range(n):
    data.append(data[0])

with open('personal_assistant.json', 'w', encoding='utf-8') as f:
    # 使用json.dump方法将数据以JSON格式写入文件;ensure_ascii=False 确保中文字符正常显示;indent=4 使得文件内容格式化,便于阅读
    json.dump(data, f, ensure_ascii=False, indent=4)

运行 generate_data.py

cd /root/ft/data
python /root/ft/data/generate_data.py

在data的路径下便生成了一个名为 personal_assistant.json 的文件:

image

一开始还很高兴,但是直到最后我发现在进行模型推理的时候不对劲:

image

看训练过程,xtuner内部会使用其他语料对模型的认知进行其他约束,所以训练不成功:

image

我们需要做的是,从数据集准备开始,重来一遍模型训练的步骤

复现多模态微调

这里我们使用的环境仍然是之前搭的,如有需要可以参考本页环境搭建一节。

模型预训练

可以通过如下代码进行预训练:

NPROC_PER_NODE=8 xtuner train llava_internlm2_chat_1_8b_clip_vit_large_p14_336_e1_gpu8_pretrain --deepspeed deepspeed_zero2

NPROC_PER_NODE=8 xtuner train llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune --deepspeed deepspeed_zero2

当然,大模型预训练对算力要求极高,作为课程可以直接导入模型权重

多模态数据集准备

这里也直接使用官方教程准备好的数据集:

cd ~ && git clone https://github.com/InternLM/tutorial -b camp2 && conda activate xtuner0.1.17 && cd tutorial

python /root/tutorial/xtuner/llava/llava_data/repeat.py \
  -i /root/tutorial/xtuner/llava/llava_data/unique_data.json \
  -o /root/tutorial/xtuner/llava/llava_data/repeated_data.json \
  -n 200

配置文件准备

我们先拷贝配置文件到当前目录:

xtuner copy-cfg \
  llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune \
  /root/tutorial/xtuner/llava

再修改llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py文件中的:

  • pretrained_pth
  • llm_name_or_path
  • visual_encoder_name_or_path
  • data_root
  • data_path
  • image_folder
# Model
- llm_name_or_path = 'internlm/internlm2-chat-1_8b'
+ llm_name_or_path = '/root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b'
- visual_encoder_name_or_path = 'openai/clip-vit-large-patch14-336'
+ visual_encoder_name_or_path = '/root/share/new_models/openai/clip-vit-large-patch14-336'

# Specify the pretrained pth
- pretrained_pth = './work_dirs/llava_internlm2_chat_1_8b_clip_vit_large_p14_336_e1_gpu8_pretrain/iter_2181.pth'  # noqa: E501
+ pretrained_pth = '/root/share/new_models/xtuner/iter_2181.pth'

# Data
- data_root = './data/llava_data/'
+ data_root = '/root/tutorial/xtuner/llava/llava_data/'
- data_path = data_root + 'LLaVA-Instruct-150K/llava_v1_5_mix665k.json'
+ data_path = data_root + 'repeated_data.json'
- image_folder = data_root + 'llava_images'
+ image_folder = data_root

# Scheduler & Optimizer
- batch_size = 16  # per_device
+ batch_size = 1  # per_device


# evaluation_inputs
- evaluation_inputs = ['请描述一下这张图片','Please describe this picture']
+ evaluation_inputs = ['Please describe this picture','What is the equipment in the image?']

当然,你可以忽视本小节的所有内容,直接执行:

cp /root/tutorial/xtuner/llava/llava_data/internlm2_chat_1_8b_llava_tutorial_fool_config.py /root/tutorial/xtuner/llava/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py

多模态模型训练

和上面差不多了:

cd /root/tutorial/xtuner/llava/
xtuner train /root/tutorial/xtuner/llava/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py --deepspeed deepspeed_zero2


训练时大约使用20000M GPU显存。所以,开启30% A100是必须的。

对比Finetune前后差异

先看Finetune前。加载Finetune前的模型:

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU

# pth转huggingface
xtuner convert pth_to_hf \
  llava_internlm2_chat_1_8b_clip_vit_large_p14_336_e1_gpu8_pretrain \
  /root/share/new_models/xtuner/iter_2181.pth \
  /root/tutorial/xtuner/llava/llava_data/iter_2181_hf

# 模型推理
xtuner chat /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \
  --visual-encoder /root/share/new_models/openai/clip-vit-large-patch14-336 \
  --llava /root/tutorial/xtuner/llava/llava_data/iter_2181_hf \
  --prompt-template internlm2_chat \
  --image /root/tutorial/xtuner/llava/llava_data/test_img/oph.jpg

我们用下面这两个问题做一个测试:

  1. Describe this image.
  2. What is the equipment in the image?

它的回复是:

然后加载Finetune后的模型:

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU

xtuner convert pth_to_hf \
  /root/tutorial/xtuner/llava/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py \
  /root/tutorial/xtuner/llava/work_dirs/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy/iter_1200.pth \
  /root/tutorial/xtuner/llava/llava_data/iter_1200_hf

xtuner chat /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \
  --visual-encoder /root/share/new_models/openai/clip-vit-large-patch14-336 \
  --llava /root/tutorial/xtuner/llava/llava_data/iter_1200_hf \
  --prompt-template internlm2_chat \
  --image /root/tutorial/xtuner/llava/llava_data/test_img/oph.jpg

对于上面那两个问题,它回答得比微调之前好:

posted @ 2024-04-13 21:51  vanilla阿草  阅读(167)  评论(0编辑  收藏  举报