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最后准备模型:
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
输出为:
解释是:
模型名 | 说明 |
---|---|
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:
所以我也没上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
来实现一键转换。
训练完成后,我们注意看模型保存位置:
那么,我们的模型在/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
模型整合
这一步不是必须的。
对于 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一致:
发现微调之后的模型泛化能力缺失。当然大模型时代大家好像更喜欢称这个东西为模型的“通用能力”。
避坑指南
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
的文件:
一开始还很高兴,但是直到最后我发现在进行模型推理的时候不对劲:
看训练过程,xtuner
内部会使用其他语料对模型的认知进行其他约束,所以训练不成功:
我们需要做的是,从数据集准备开始,重来一遍模型训练的步骤。
复现多模态微调
这里我们使用的环境仍然是之前搭的,如有需要可以参考本页环境搭建一节。
模型预训练
可以通过如下代码进行预训练:
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
我们用下面这两个问题做一个测试:
- Describe this image.
- 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
对于上面那两个问题,它回答得比微调之前好: