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
输出为:
解释是:
模型名 | 说明 |
---|---|
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
对于上面那两个问题,它回答得比微调之前好:
XTuner 微调 LLM实操-书生浦语大模型实战营第二期第4节作业的更多相关文章
- SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录
SFUD+FAL+EasyFlash典型场景需求分析:用整个flash存储数据,上千条数据,读取得时候用easyflash很慢,估计要检索整个flash太慢了. 改进方法:分区检索. 1存数据时,根据 ...
- css知识笔记:水平垂直居中(别只看,请实操!!!)
css实现元素的水平垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目 ...
- css知识笔记:垂直居中(别只看,请实操!!!)
css实现元素的垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- css知识笔记:水平居中(别只看,请实操!!!)
css实现元素的水平居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- Golang的运算符优先级实操案例
Golang的运算符优先级实操案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.运算符优先级案例 运算符是用来在程序运行时执行数学或逻辑运算的,在Go语言中,一个表达式可以包 ...
- Hive中的数据类型以及案例实操
@ 目录 基本数据类型 集合数据类型 案例实操 基本数据类型 对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了
引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中? 本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...
- UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>
K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others) Memory Limit: 32000/32000KB (Java/Others) Su ...
- Mysql MHA(GTID)配置(实操)
实现环境 centos6.7 MYSQL5.6.36 主:192.168.1.191 从1:192.168.1.145 从2:192.168.1.146 监测:放在从2上 192.168.1.146 ...
随机推荐
- KingbaseES数据库批量加载数据的最佳方法
前言 本文讨论在KingbaseES数据库服务器中批量加载数据的方法,以及空数据库中的初始数据加载和增量数据加载的最佳做法. 批量加载方法 以下数据加载方法按照从最耗时到最不耗时的顺序排列: 1.运行 ...
- C++原子操作与内存序 1
问题 #include<iostream> #include<thread> int main() { int sum = 0; auto f = [&sum]() { ...
- 【非插件实现】wordpress网站页脚添加,网站总访问数/今日访客数
1 /** 2 * 统计全站总访问量/今日总访问量/当前是第几个访客 3 * @return [type] [description] 4 */ 5 function wb_site_count_us ...
- 【已解决】wordpress 修改固定链接 伪静态URL出现nginx 404错误
一.站点设置 打开站点设置,选择伪静态,选择wordpress 二.wordpress设置 打开wordpress后台,选择设置 --->固定链接 选择一个你喜欢的格式点击保存 之后打开你的文章 ...
- 配置腾讯云轻量级linux服务器用到的资源和步骤
pasv_address=82.157.112.34 #请修改为您的 Linux 云服务器公网 IPsftp://82.157.112.34:21 ①下载系统可视化https://cloud.tenc ...
- C 语言用户输入详解:scanf、fgets、内存地址解析及实用指南
C 语言中的用户输入 您已经学习了 printf() 函数用于在 C 语言中输出值. 要获取用户输入,可以使用 scanf() 函数: // 声明一个整数变量,用于存储我们从用户那里获得的数字 int ...
- C 语言教程:数据类型和格式说明符
C 语言中的数据类型 C 中的变量必须是指定的数据类型,并且您必须在 printf() 函数中使用格式说明符来显示它: // 创建变量 int myNum = 5; // 整数(没有小数点) floa ...
- UML 哲学之道——领域模型[四]
前言 简单整理一下领域模型. 正文 领域模型是对领域内的概念类或现实中的对象的可视化表示 领域模型也称概念模型.领域对象模型和分析对象模型 领域模型是可以在业务建模科目中创建的制品之一 领域模型是up ...
- 力扣18(java)-四数之和(中等)
题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d ...
- 力扣459(java)-重复的子字符串(简单)
题目: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab"输出: true解释: 可由子串 "ab&quo ...