diff --git a/assets/emoxlmdeploy.png b/assets/emoxlmdeploy.png new file mode 100644 index 0000000..8690134 Binary files /dev/null and b/assets/emoxlmdeploy.png differ diff --git a/deploy/lmdeploy.md b/deploy/lmdeploy.md new file mode 100644 index 0000000..181598d --- /dev/null +++ b/deploy/lmdeploy.md @@ -0,0 +1,227 @@ +![](../assets/emoxlmdeploy.png) +# LMDeploy本地部署 +## 1.环境配置 +
+ +具体部署环境 + +Package Version + +------------------------- ----------- + +accelerate 0.27.2 +addict 2.4.0 +aiofiles 23.2.1 +aiohttp 3.9.3 +aiosignal 1.3.1 +aliyun-python-sdk-core 2.14.0 +aliyun-python-sdk-kms 2.16.2 +altair 5.2.0 +annotated-types 0.6.0 +anyio 4.2.0 +async-timeout 4.0.3 +attrs 23.2.0 +blinker 1.7.0 +Brotli 1.0.9 +cachetools 5.3.3 +certifi 2023.11.17 +cffi 1.16.0 +charset-normalizer 2.0.4 +click 8.1.7 +contourpy 1.2.0 +crcmod 1.7 +cryptography 41.0.3 +cycler 0.12.1 +datasets 2.17.0 +dill 0.3.8 +einops 0.7.0 +exceptiongroup 1.2.0 +fastapi 0.109.2 +ffmpy 0.3.2 +filelock 3.13.1 +fire 0.5.0 +flash-attn 2.4.2 +fonttools 4.49.0 +frozenlist 1.4.1 +fsspec 2023.10.0 +fuzzywuzzy 0.18.0 +gitdb 4.0.11 +GitPython 3.1.42 +gmpy2 2.1.2 +gradio 3.50.2 +gradio_client 0.6.1 +h11 0.14.0 +httpcore 1.0.3 +httpx 0.26.0 +huggingface-hub 0.20.3 +idna 3.4 +importlib-metadata 6.11.0 +importlib-resources 6.1.1 +Jinja2 3.1.2 +jmespath 0.10.0 +jsonschema 4.21.1 +jsonschema-specifications 2023.12.1 +kiwisolver 1.4.5 +lmdeploy 0.2.4 +markdown-it-py 3.0.0 +MarkupSafe 2.1.1 +matplotlib 3.8.3 +mdurl 0.1.2 +mkl-fft 1.3.8 +mkl-random 1.2.4 +mkl-service 2.4.0 +mmengine-lite 0.10.3 +mpmath 1.3.0 +multidict 6.0.5 +multiprocess 0.70.16 +networkx 3.1 +ninja 1.11.1.1 +numpy 1.26.2 +nvidia-cublas-cu11 11.11.3.6 +nvidia-cuda-runtime-cu11 11.8.89 +nvidia-nccl-cu11 2.19.3 +openxlab 0.0.34 +orjson 3.9.14 +oss2 2.17.0 +packaging 23.2 +pandas 2.2.0 +peft 0.8.2 +Pillow 9.5.0 +pip 23.3.1 +platformdirs 4.2.0 +protobuf 4.25.3 +psutil 5.9.8 +pyarrow 15.0.0 +pyarrow-hotfix 0.6 +pybind11 2.11.1 +pycparser 2.21 +pycryptodome 3.20.0 +pydantic 2.6.1 +pydantic_core 2.16.2 +pydeck 0.8.1b0 +pydub 0.25.1 +Pygments 2.17.2 +Pympler 1.0.1 +pynvml 11.5.0 +pyOpenSSL 23.2.0 +pyparsing 3.1.1 +PySocks 1.7.1 +python-dateutil 2.8.2 +python-multipart 0.0.9 +pytz 2023.4 +pytz-deprecation-shim 0.1.0.post0 +PyYAML 6.0.1 +referencing 0.33.0 +regex 2023.12.25 +requests 2.28.2 +rich 13.4.2 +rpds-py 0.18.0 +safetensors 0.4.2 +semantic-version 2.10.0 +sentencepiece 0.1.99 +setuptools 60.2.0 +shortuuid 1.0.11 +six 1.16.0 +smmap 5.0.1 +sniffio 1.3.0 +starlette 0.36.3 +streamlit 1.24.0 +sudo 1.0.0 +sympy 1.11.1 +tenacity 8.2.3 +termcolor 2.4.0 +tiktoken 0.6.0 +tokenizers 0.15.2 +toml 0.10.2 +tomli 2.0.1 +toolz 0.12.1 +torch 2.0.1 +torchaudio 2.0.2 +torchvision 0.15.2 +tornado 6.4 +tqdm 4.65.2 +transformers 4.37.1 +triton 2.2.0 +typing_extensions 4.9.0 +tzdata 2024.1 +tzlocal 4.3.1 +urllib3 1.26.18 +uvicorn 0.27.1 +validators 0.22.0 +watchdog 4.0.0 +websockets 11.0.3 +wheel 0.41.2 +xxhash 3.4.1 +yapf 0.40.2 +yarl 1.9.4 +zipp 3.17.0 +
+ +lmdeploy 没有安装,我们接下来手动安装一下,建议安装最新的稳定版。 如果是在 InternStudio 开发环境,需要先运行下面的命令,否则会报错。 +``` +# 解决 ModuleNotFoundError: No module named 'packaging' 问题 +pip install packaging +# 使用 flash_attn 的预编译包解决安装过慢问题 +pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl +``` +由于默认安装的是 runtime 依赖包,但是我们这里还需要部署和量化,所以,这里选择 [all]。然后可以再检查一下 lmdeploy 包,如下图所示 +``` +pip install 'lmdeploy[all]==v0.1.0' +``` +但是lmdeploy的0.1.0版本并不支持InternLM2-7B-chat的Turbomind转化 +注意lmdeploy的版本要要进行更新: +``` +# 我们使用的是0.2.4版本的lmdeploy +pip install --upgrade lmdeploy +``` + +## 2.模型转化 +使用 TurboMind 推理模型需要先将模型转化为 TurboMind 的格式,目前支持在线转换和离线转换两种形式。在线转换可以直接加载 Huggingface 模型,离线转换需需要先保存模型再加载。 + +TurboMind 是一款关于 LLM 推理的高效推理引擎,基于英伟达的 FasterTransformer 研发而成。它的主要功能包括:LLaMa 结构模型的支持,persistent batch 推理模式和可扩展的 KV 缓存管理器。 +### 2.1 在线转化 +lmdeploy 支持直接读取 Huggingface 模型权重,目前共支持三种类型: + +在 huggingface.co 上面通过 lmdeploy 量化的模型,如 llama2-70b-4bit, internlm-chat-20b-4bit +huggingface.co 上面其他 LM 模型,如 Qwen/Qwen-7B-Chat +示例如下: +``` +# 需要能访问 Huggingface 的网络环境 +lmdeploy chat turbomind internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b +lmdeploy chat turbomind Qwen/Qwen-7B-Chat --model-name qwen-7b +``` +上面两行命令分别展示了如何直接加载 Huggingface 的模型,第一条命令是加载使用 lmdeploy 量化的版本,第二条命令是加载其他 LLM 模型。 + +我们也可以直接启动本地的 Huggingface 模型,如下所示。 +``` +lmdeploy chat turbomind /EmoLLM --model-name internlm2-chat-7b +``` +以上命令都会启动一个本地对话界面,通过 Bash 可以与 LLM 进行对话。 +### 2.2 离线转化 +离线转换需要在启动服务之前,将模型转为 lmdeploy TurboMind 的格式,如下所示。 +``` +# 转换模型(FastTransformer格式) TurboMind +lmdeploy convert internlm2-chat-7b /EmoLLM +``` +执行完成后将会在当前目录生成一个```workspace```的文件夹。这里面包含的就是 TurboMind 和 Triton “模型推理”需要到的文件。 +## 3.本地运行 +### 3.1 TurboMind 推理+命令行本地对话 +模型转换完成后,我们就具备了使用模型推理的条件,接下来就可以进行真正的模型推理环节。 + +我们先尝试本地对话(Bash Local Chat),下面用(Local Chat 表示)在这里其实是跳过 API Server 直接调用 TurboMind。简单来说,就是命令行代码直接执行 TurboMind。所以说,实际和前面的架构图是有区别的。 + +这里支持多种方式运行,比如Turbomind、PyTorch、DeepSpeed。但 PyTorch 和 DeepSpeed 调用的其实都是 Huggingface 的 Transformers 包,PyTorch表示原生的 Transformer 包,DeepSpeed 表示使用了 DeepSpeed 作为推理框架。Pytorch/DeepSpeed 目前功能都比较弱,不具备生产能力,不推荐使用。 + +执行命令如下。 +``` +# Turbomind + Bash Local Chat +lmdeploy chat turbomind ./workspace +``` +输入后两次回车,退出时输入exit 回车两次即可。此时,Server 就是本地跑起来的模型(TurboMind),命令行可以看作是前端。 +### 3.2 TurboMind推理+API服务 +在上面的部分我们尝试了直接用命令行启动 Client,接下来我们尝试如何运用 lmdepoy 进行服务化 +首先,通过下面命令启动服务。 +``` +lmdeploy serve api_server ./workspace --server-name 0.0.0.0 --server-port ${server_port} --tp 1 +``` +详细内容请见[文档](https://lmdeploy.readthedocs.io/zh-cn/stable/serving/restful_api.html)