背景

在当下开源大语言模型炽热的背景下,有很大一部分开发者心愿本地部署开源 LLM ,用于钻研 LLM 或者是基于开源 LLM 构建本人的 LLM 利用。笔者也正在尝试通过开源社区的一系列相干优良我的项目,通过本地化部署服务来构建本人的 LLM 利用。那么本地部署一个开源 LLM 来构建一个聊天利用须要哪些筹备呢?

  1. 本地环境的筹备: 因为咱们须要在本地部署一个开源的大模型,所以你须要筹备一个相当硬核的本地环境。硬件上须要一台领有高性能大显存的 NVDIA 显卡、大容量高速内存以及大容量固态硬盘,软件上则须要装置显卡驱动、CUDA、Python 环境。笔者这次抉择跑 Baichuan-chat-13B 模型为例,我的根本配置是 CPU i9-13900K、GTX3090 24GB双卡、64GB 内存和 2TB 固态硬盘。
  2. 一个大型语言模型(LLM) :这是咱们构建 LLM 利用的根底。不同的 LLM 依据预训练的数据和指标工作的不同,其模型构造和学到的常识也不雷同。基于不同模型构建进去的 AI 利用体现也会不一样。你能够通过炽热的 AI 社区 Hugging Face 上找本人感兴趣的开源 LLMs 来进行尝试和能力比照 。
  3. 一个 本地部署 LLM 的推理服务 推理服务能够将预训练好的 LLM 模型加载到本地服务器,并提供模型预测接口,这样就能够本地化应用 LLM 模型进行各种 NLP 工作,而不须要依赖云服务。你能够应用一些优良的 GitHub 开源我的项目,这些我的项目对热门的开源 LLM 都做了推理服务的一键部署。知名度比拟高、star 比拟多的有 LocalAI、openLLM 等。
  4. 一个简略易用的“ LLM 操作系统”Dify.AI:如果要基于 LLM 的能力构建一个聊天利用,你可能须要学习钻研全套的 LLM 技术栈,比方:不同模型的 API 调用、向量数据库选型、embedding 技术钻研等等。如果你应用开源我的项目 Dify.AI(https://github.com/langgenius/dify) ,则能够省掉这些钻研学习工作,帮忙你通过可视化的界面即可疾速创立基于不同 LLM 能力的 AI 利用。 Dify 最近的版本新增了对开源 LLMs 的反对,对托管在 HuggingFace 和 Replicate 上所有的模型都能疾速调用和切换应用,同时反对本地部署形式可能基于 openLLM 和 Xorbits inference 推理服务来实现 AI 利用的构建。

本文笔者将尝试应用开源的 LLMOps 平台 Dify.AI + 开源的推理服务 Xinference + 开源模型 baichuan-chat-13B 为例,手把手实操教你在 windows 环境下,应用全套开源工具产品来构建一个 LLM 聊天利用。话不多说咱们间接动工。

环境筹备

根本的 conda 和 Python 个别应该都有了。不过本文还是从零开始介绍环境配置吧。

配置 python 环境

个别状况下倡议应用 conda 进行 python 版本治理。先依据 conda 官网文档装置 conda。而后用 conda 初始化 Python 3.11 环境:

conda create --name python-3-11 python=3.11conda activate python-3-11

装置 CUDA

举荐间接从官网装置。我这是 Windows 11 就选下图版本。

依据疏导装置完,关上 NVDIA 控制面板 -> 零碎信息 看到装上了。

WSL2 筹备

因为 Dify 的 docker 部署举荐应用 WSL2 环境。所以当初先装置 WSL2 。参考微软官网指引。

  • 第一步,管理员身份运行 CMD

  • 第二步,在 CMD 中用指令装置

    • wsl --install

        后果看到了反对的各种零碎版本

    • 实用于 Linux 的 Windows 子系统已装置。以下是可装置的无效散发的列表。请应用“wsl --install -d <散发>”装置。NAME                                   FRIENDLY NAMEUbuntu                                 UbuntuDebian                                 Debian GNU/Linuxkali-linux                             Kali Linux RollingUbuntu-18.04                           Ubuntu 18.04 LTSUbuntu-20.04                           Ubuntu 20.04 LTSUbuntu-22.04                           Ubuntu 22.04 LTSOracleLinux_7_9                        Oracle Linux 7.9OracleLinux_8_7                        Oracle Linux 8.7OracleLinux_9_1                        Oracle Linux 9.1openSUSE-Leap-15.5                     openSUSE Leap 15.5SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5openSUSE-Tumbleweed                    openSUSE Tumbleweed

 我应用抉择装置了默认的 Ubuntu 版本:

 wsl --install -d Ubuntu

之后就能够在 CMD 中应用 wsl命令进入Ubuntu 了。

  • 第三步,装置 Docker Desktop

      去 Docker 官网文档下载 Docker Desktop。装置时留神勾上 Use WSL 2 instead of Hyper-V 选项。装置实现后重启电脑。通过 CMD 查看是否失常装置好。

    • wsl -l --verbose NAME                   STATE           VERSION* Ubuntu                 Running         2  docker-desktop         Running         2
         能够看到 WSL 中 Ubuntu 和 Docker 都运行起来了,并且确认是 WSL2 版本。
  • 第四步,为 WSL 配置代理

    因为每次重启后 WSL 的 ip 地址都会变更,所以咱们能够编写一个脚本来解决。第 4 行改为你本人的端口号。

    • #!/bin/shhostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')wslip=$(hostname -I | awk '{print $1}')port=7890 PROXY_HTTP="http://${hostip}:${port}" set_proxy(){  export http_proxy="${PROXY_HTTP}"  export HTTP_PROXY="${PROXY_HTTP}"   export https_proxy="${PROXY_HTTP}"  export HTTPS_proxy="${PROXY_HTTP}"   export ALL_PROXY="${PROXY_SOCKS5}"  export all_proxy=${PROXY_SOCKS5}   git config --global http.https://github.com.proxy ${PROXY_HTTP}  git config --global https.https://github.com.proxy ${PROXY_HTTP}   echo "Proxy has been opened."} unset_proxy(){  unset http_proxy  unset HTTP_PROXY  unset https_proxy  unset HTTPS_PROXY  unset ALL_PROXY  unset all_proxy  git config --global --unset http.https://github.com.proxy  git config --global --unset https.https://github.com.proxy   echo "Proxy has been closed."} test_setting(){  echo "Host IP:" ${hostip}  echo "WSL IP:" ${wslip}  echo "Try to connect to Google..."  resp=$(curl -I -s --connect-timeout 5 -m 5 -w "%{http_code}" -o /dev/null www.google.com)  if [ ${resp} = 200 ]; then    echo "Proxy setup succeeded!"  else    echo "Proxy setup failed!"  fi} if [ "$1" = "set" ]then  set_proxy elif [ "$1" = "unset" ]then  unset_proxy elif [ "$1" = "test" ]then  test_settingelse  echo "Unsupported arguments."fi

        能够批改~/.bashrc 方便使用命令:

    • alias proxy="source /path/to/proxy.sh"

        具体能够参考了这个博客(https://www.cnblogs.com/tuilk/p/16287472.html)

  • 第五步,进入 Ubuntu 装置 conda 配置 python

      和后面的环境筹备一样,参照官网文档装置 conda 配置 python,不过是装置 linux 版本。

  • 第六步,装置 WSL 的 CUDA

      进入官网,抉择 WSL-Ubuntu 版本,依照指引应用命令行装置。

      批改~/.bashrc将 CUDA 增加至环境变量:

    • export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64
  • 第七步,装置 PyTorch

      进入 PyTorch 官网,依照环境装置 PyTorch 。

这样环境筹备总算实现了。

部署推理服务 Xinference

依据 Dify 的部署文档,Xinference 反对的模型还挺多的。这次就选 Xinference 尝试下 baichuan-chat-3B 吧。

Xorbits inference 是一个弱小且通用的分布式推理框架,旨在为大型语言模型、语音辨认模型和多模态模型提供服务,甚至能够在笔记本电脑上应用。它反对多种与GGML兼容的模型,如 ChatGLM, Baichuan, Whisper, Vicuna, Orca 等。 Dify 反对以本地部署的形式接入 Xinference 部署的大型语言模型推理和 embedding 能力。

装置 Xinfernece

在 WSL 中执行如下命令:

$ pip install "xinference"

下面的命令会装置 Xinference 用于推理的根底依赖。Xinference 还反对用 ggml 推理PyTorch 推理,须要装如下的依赖:

$ pip install "xinference[ggml]"$ pip install "xinference[pytorch]"$ pip install "xinference[all]"

启动 Xinference 并下载部署 baichuan-chat-3B 模型

在 WSL 中执行上面的命令:

$ xinference -H 0.0.0.0

Xinference 默认会在本地启动一个 worker,端点为:http://127.0.0.1:9997,端口默认为 9997。 默认只可本机拜访,配置了 -H 0.0.0.0,非本地客户端可任意拜访。 如需进一步批改 host 或 port,可查看 xinference 的帮忙信息:xinference --help

2023-08-25 18:08:31,204 xinference   27505 INFO     Xinference successfully started. Endpoint: http://0.0.0.0:99972023-08-25 18:08:31,204 xinference.core.supervisor 27505 INFO     Worker 0.0.0.0:53860 has been added successfully2023-08-25 18:08:31,205 xinference.deploy.worker 27505 INFO     Xinference worker successfully started.

在浏览器中关上: http://localhost:9997,抉择 baichuan-chat,pytorch,13B,4bit,点击 create 部署。

或者应用 CLI 部署:

xinference launch --model-name baichuan-chat --model-format pytorch --size-in-billions 13 --quantization 4

因为不同模型在不同硬件平台兼容性不同,请查看 Xinference 内置模型 确定创立的模型是否反对以后硬件平台。

应用 Xinference 治理模型

要查看部署好的所有模型,在命令行中,执行上面的命令:

$ xinference list 

会显示相似上面的信息:

UID                                   Type    Name           Format      Size (in billions)  Quantization------------------------------------  ------  -------------  --------  --------------------  --------------0db1e250-4330-11ee-b9ef-00155da30d2d  LLM     baichuan-chat  pytorch                     13  4-bit

0db1e250-4330-11ee-b9ef-00155da30d2d 就是方才部署的模型的 uid 。

部署 Dify.AI

次要流程参考官网部署文档。

Clone Dify

Clone Dify 源代码至本地

git clone https://github.com/langgenius/dify.git

Start Dify

进入 dify 源代码的 docker 目录,执行一键启动命令:

cd dify/dockerdocker compose up -d

部署后果:

[+] Running 7/7 ✔ Container docker-weaviate-1  Running                                                0.0s  ✔ Container docker-web-1       Running                                                0.0s  ✔ Container docker-redis-1     Running                                                0.0s  ✔ Container docker-db-1        Running                                                0.0s  ✔ Container docker-worker-1    Running                                                0.0s  ✔ Container docker-api-1       Running                                                0.0s  ✔ Container docker-nginx-1     Started                                                0.9s 

最初查看是否所有容器都失常运行:

docker compose ps

运行状态:

NAME                IMAGE                              COMMAND                  SERVICE             CREATED             STATUS              PORTSdocker-api-1        langgenius/dify-api:0.3.16         "/bin/bash /entrypoi…"   api                 24 hours ago        Up 3 hours          5001/tcpdocker-db-1         postgres:15-alpine                 "docker-entrypoint.s…"   db                  33 hours ago        Up 3 hours          0.0.0.0:5432->5432/tcpdocker-nginx-1      nginx:latest                       "/docker-entrypoint.…"   nginx               24 hours ago        Up 4 minutes        0.0.0.0:80->80/tcpdocker-redis-1      redis:6-alpine                     "docker-entrypoint.s…"   redis               33 hours ago        Up 3 hours          6379/tcpdocker-weaviate-1   semitechnologies/weaviate:1.18.4   "/bin/weaviate --hos…"   weaviate            33 hours ago        Up 3 hours          docker-web-1        langgenius/dify-web:0.3.16         "/bin/sh ./entrypoin…"   web                 33 hours ago        Up 3 hours          3000/tcpdocker-worker-1     langgenius/dify-api:0.3.16         "/bin/bash /entrypoi…"   worker              33 hours ago        Up 3 hours          5001/tcp

包含 3 个业务服务 api / worker / web,以及 4 个根底组件 weaviate / db / redis / nginx

Docker 启动胜利后,在浏览器中拜访:http://127.0.0.1/。设置过明码,登陆后,会进入利用列表页。

至此,胜利应用 Docker 部署了 Dify 社区版。

在 Dify 接入 Xinference

配置模型供应商

设置 > 模型供应商 > Xinference 中填入模型信息:

  • Model Name 是你本人起给模型部署的名字。
  • Server URL 是 xinference 的 end point 地址。
  • Model UID 则是通过 xinference list获取到的部署的模型的 UID

须要留神的是 Sever Url 不能用 localhost。因为如果填 localhost,拜访的是 docker 里的 localhost,会导致拜访失败。解决方案是将 Sever Url 改成局域网 ip。

而 WSL 环境下则须要应用 WSL 的 IP 地址。

在 WSL 中应用命令获取:

hostname -I172.31.157.121

应用 baichuan-chat

创立利用,就能够在利用中应用上一步配置的 baichuan-chat-3B 模型啦。在 Dify 的提醒词编排界面,抉择 baichuan-chat 模型,设计你的利用提醒词(prompt),即可公布一个可拜访的 AI 利用。

以上,就是本地部署 Dify 接入 Xinference 部署的 baichuan-chat 的全过程。 至此,咱们基于 baichuan-chat-13B 的一个根本的聊天利用就根本实现了。

后记

当然,对于一个生产级别的 LLM 利用来说,只是实现大模型的接入和推理、聊天交互是远远不够。咱们还须要针对性的对 LLM 进行 Prompt 的调优、增加公有数据作为上下文,亦或者是对 LLM 自身进行微调等工作,这须要长期的迭代和优化能力使得 LLM 利用体现越来越好。Dify.AI 作为一个中间件工具平台,提供了一个残缺 LLM App 技术栈的可视化的操作系统。实现了以上的根底服务部署后,后续的利用迭代和改良都能够基于 Dify 来实现,使得 LLM 利用的构建和治理变得更加简略和易用,在业务数据的解决上间接上传即可主动实现荡涤解决,后续也将提供数据标注和改良的服务,甚至你的业务团队都能够参加合作。

目前 LLM 的倒退和利用落地还处于十分晚期的阶段,置信在不久后,无论是 LLM 的能力开释,还是基于 LLM 之上的各个工具能力的不断完善,都会一直升高开发者摸索 LLM 能力的门槛,让更多丰盛场景的 AI 利用涌现。