当前位置:   article > 正文

【本地大模型部署与微调】ChatGLM3-6b、m3e、one-api、Fastgpt、LLaMA-Factory_fastgpt m3e

fastgpt m3e

本文档详细介绍了使用ChatGLM3-6b大模型、m3e向量模型、one-api接口管理以及Fastgpt的知识库,成功的在本地搭建了一个大模型。此外,还利用LLaMA-Factory进行了大模型的微调。

1.ChatGLM3-6b

2.m3e

3.One-API

4.Fastgpt

5.LLaMA-Factory

1.部署ChatGLM3-6b大模型

1.1创建腾讯云服务器

注意:

ChatGLM3-6b的大模型40多个G,购买腾讯云服务器的时候一定要扩容硬盘,否则会出现克隆失败的情况.

后面微调大模型的时候微调好的模型需要导出,所以最好扩容>=200

腾讯云服务器官网>产品>计算>高性能应用服务

选择AI框架>Pytorch2.0.0

等待创建成功之后使用JupyterLab进入

点击Terminal(终端)

1.2 下载大模型和向量模型

  1. mkdir models
  2. cd models
  3. apt update
  4. apt install git-lfs
  5. # 克隆chatGLM3-6b大模型
  6. git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
  7. # 克隆m3e向量模型
  8. git clone https://www.modelscope.cn/xrunda/m3e-base.git

1.3 下载chatglm3-demo项目

  1. mkdir webcodes
  2. cd webcodes
  3. # 下载chatglm3-6b web_demo项目
  4. git clone https://github.com/THUDM/ChatGLM3.git
  5. pip install -r requirements.txt

1.4 修改model路径

打开basic_demo/web_demo_streamlit.py文件,修改MODEL_PATH的路径为本地大模型的路径

1.4 运行web_demo项目

  1. cd basic_demo
  2. streamlit run web_demo_streamlit.py

首次运行的话到1.4这停止,目的是为了测试大模型是否跑通.

下面的1.5 后面会有使用的时机

1.5 修改api_server.py文件

  1. cd ChatGLM3/openai_api_demo
  2. # 然后找到api_server.py文件夹
  3. # 修改里面的MODEL_PATH 和 EMBEDDING_PATH 为本地的大模型地址和向量模型地址

修改文件最下面的device_map="cuda"

model = AutoModel.from_pretrained(MODEL_PATH,trust_remote_code=True,device_map="cuda").eval()

2.下载docker和docker compose

  1. # 安装 Docker
  2. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  3. systemctl enable --now docker
  4. # 安装 docker-compose
  5. curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  6. chmod +x /usr/local/bin/docker-compose
  7. # 验证安装
  8. docker -v
  9. docker-compose -v
  10. # 如失效,自行百度~

3.使用docker部署one-api项目

  1. docker run --name one-api -d --restart always -p 3080:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api

3.1 修改大模型运行端口

把1.4运行的项目停止

而后查看1.5的运行方式

3.2添加chatglm3的渠道

Base_URL是部署大模型的服务器的ip地址,端口号为启动大模型的端口号.

秘钥随便填

3.3添加m3e渠道

同上

3.4测试渠道是否跑通

3.5添加令牌

4.部署fastgpt

  1. mkdir fastgpt
  2. cd fastgpt
  3. curl -O https://raw.githubusercontent.com/labring/FastGPT/main/files/deploy/fastgpt/docker-compose.yml
  4. curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json

4.1修改docker-compose.yml

修改docker-compose.yml中的OPENAI_BASE_URL(API 接口的地址,需要加/v1)和CHAT_API_KEY(API 接口的凭证)。

使用 OneAPI 的话,OPENAI_BASE_URL=OneAPI访问地址/v1;CHAT_API_KEY=令牌

  1. # 非 host 版本, 不使用本机代理
  2. # (不懂 Docker 的,只需要关心 OPENAI_BASE_URL 和 CHAT_API_KEY 即可!)
  3. version: '3.3'
  4. services:
  5. pg:
  6. image: ankane/pgvector:v0.5.0 # git
  7. # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.5.0 # 阿里云
  8. container_name: pg
  9. restart: always
  10. ports: # 生产环境建议不要暴露
  11. - 5432:5432
  12. networks:
  13. - fastgpt
  14. environment:
  15. # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
  16. - POSTGRES_USER=username
  17. - POSTGRES_PASSWORD=password
  18. - POSTGRES_DB=postgres
  19. volumes:
  20. - ./pg/data:/var/lib/postgresql/data
  21. mongo:
  22. image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18
  23. container_name: mongo
  24. restart: always
  25. ports:
  26. - 27017:27017
  27. networks:
  28. - fastgpt
  29. command: mongod --keyFile /data/mongodb.key --replSet rs0
  30. environment:
  31. - MONGO_INITDB_ROOT_USERNAME=myusername
  32. - MONGO_INITDB_ROOT_PASSWORD=mypassword
  33. volumes:
  34. - ./mongo/data:/data/db
  35. entrypoint:
  36. - bash
  37. - -c
  38. - |
  39. openssl rand -base64 128 > /data/mongodb.key
  40. chmod 400 /data/mongodb.key
  41. chown 999:999 /data/mongodb.key
  42. exec docker-entrypoint.sh $$@
  43. fastgpt:
  44. container_name: fastgpt
  45. image: ghcr.io/labring/fastgpt:latest # git
  46. # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云
  47. ports:
  48. - 3000:3000
  49. networks:
  50. - fastgpt
  51. depends_on:
  52. - mongo
  53. - pg
  54. restart: always
  55. environment:
  56. # root 密码,用户名为: root
  57. - DEFAULT_ROOT_PSW=1234
  58. # 中转地址,如果是用官方号,不需要管。务必加 /v1
  59. - OPENAI_BASE_URL=https://api.openai.com/v1
  60. - CHAT_API_KEY=sk-xxxx
  61. - DB_MAX_LINK=5 # database max link
  62. - TOKEN_KEY=any
  63. - ROOT_KEY=root_key
  64. - FILE_TOKEN_KEY=filetoken
  65. # mongo 配置,不需要改. 用户名myusername,密码mypassword。
  66. - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
  67. # pg配置. 不需要改
  68. - PG_URL=postgresql://username:password@pg:5432/postgres
  69. volumes:
  70. - ./config.json:/app/data/config.json
  71. networks:
  72. fastgpt:

4.2 修改config.json

需要注意的是llmModels中datasetProcess必须设置为true知识库才会生效,否则知识库会出问题

  1. {
  2. "systemEnv": {
  3. "vectorMaxProcess": 15,
  4. "qaMaxProcess": 15,
  5. "pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
  6. },
  7. "llmModels": [
  8. {
  9. "model": "chatglm3", // 模型名
  10. "name": "chatglm3", // 别名
  11. "maxContext": 16000, // 最大上下文
  12. "maxResponse": 4000, // 最大回复
  13. "quoteMaxToken": 13000, // 最大引用内容
  14. "maxTemperature": 1.2, // 最大温度
  15. "charsPointsPrice": 0,
  16. "censor": false,
  17. "vision": false, // 是否支持图片输入
  18. "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错
  19. "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true
  20. "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true
  21. "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true
  22. "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true
  23. "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持)
  24. "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
  25. "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
  26. "customExtractPrompt": "", // 自定义内容提取提示词
  27. "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
  28. "defaultConfig":{} // LLM默认配置,可以针对不同模型设置特殊值(比如 GLM4top_p
  29. },
  30. ],
  31. "vectorModels": [
  32. {
  33. "model": "m3e",
  34. "name": "m3e",
  35. "charsPointsPrice": 0,
  36. "defaultToken": 700,
  37. "maxToken": 3000,
  38. "weight": 100,
  39. "defaultConfig":{} // 默认配置。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
  40. }
  41. ],
  42. "reRankModels": [],
  43. "audioSpeechModels": [
  44. {
  45. "model": "tts-1",
  46. "name": "OpenAI TTS1",
  47. "charsPointsPrice": 0,
  48. "voices": [
  49. { "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" },
  50. { "label": "Echo", "value": "echo", "bufferId": "openai-Echo" },
  51. { "label": "Fable", "value": "fable", "bufferId": "openai-Fable" },
  52. { "label": "Onyx", "value": "onyx", "bufferId": "openai-Onyx" },
  53. { "label": "Nova", "value": "nova", "bufferId": "openai-Nova" },
  54. { "label": "Shimmer", "value": "shimmer", "bufferId": "openai-Shimmer" }
  55. ]
  56. }
  57. ],
  58. "whisperModel": {
  59. "model": "whisper-1",
  60. "name": "Whisper1",
  61. "charsPointsPrice": 0
  62. }
  63. }

4.3 启动容器

  1. # 进入项目目录
  2. cd 项目目录
  3. # 启动容器
  4. docker-compose pull
  5. docker-compose up -d

4.4 初始化Mongo副本集(4.6.8以前可忽略)

  1. # 查看 mongo 容器是否正常运行
  2. docker ps
  3. # 进入容器
  4. docker exec -it mongo bash
  5. # 连接数据库(这里要填Mongo的用户名和密码)
  6. mongo -u myusername -p mypassword --authenticationDatabase admin
  7. # 初始化副本集。如果需要外网访问,mongo:27017 可以改成 ip:27017。但是需要同时修改 FastGPT 连接的参数(MONGODB_URI=mongodb://myname:mypassword@mongo:27017/fastgpt?authSource=admin => MONGODB_URI=mongodb://myname:mypassword@ip:27017/fastgpt?authSource=admin)
  8. rs.initiate({
  9. _id: "rs0",
  10. members: [
  11. { _id: 0, host: "mongo:27017" }
  12. ]
  13. })
  14. # 检查状态。如果提示 rs0 状态,则代表运行成功
  15. rs.status()

4.5 访问fastGPT

目前可以通过 ip:3000 直接访问(注意防火墙)。登录用户名为 root,密码为docker-compose.yml环境变量里设置的 DEFAULT_ROOT_PSW。

如果需要域名访问,请自行安装并配置 Nginx。

5.微调大模型

微调大模型的时候,需要把运行中的大模型服务停止,否则会出现运行显存不足的错误.

5.1环境搭建(可跳过)

  1. git clone https://github.com/hiyouga/LLaMA-Factory.git
  2. conda create -n llama_factory python=3.10
  3. conda activate llama_factory
  4. cd LLaMA-Factory
  5. pip install -r requirements.txt

5.2取sha1值

  1. import hashlib
  2. def calculate_sha1(file_path):
  3. sha1 = hashlib.sha1()
  4. try:
  5. with open(file_path, 'rb') as file:
  6. while True:
  7. data = file.read(8192) # Read in chunks to handle large files
  8. if not data:
  9. break
  10. sha1.update(data)
  11. return sha1.hexdigest()
  12. except FileNotFoundError:
  13. return "File not found."
  14. # 使用示例
  15. file_path = './data/self_cognition_modified.json' # 替换为您的文件路径
  16. sha1_hash = calculate_sha1(file_path)
  17. print("SHA-1 Hash:", sha1_hash)

5.3 修改数据集

训练的数据集放在LLaMA-Factory/data目录下

可以根据自己的情况上传训练数据集

  1. # 自定义数据集
  2. [
  3. {
  4. "instruction": "用户指令(必填)",
  5. "input": "用户输入(选填)",
  6. "output": "模型回答(必填)",
  7. "system": "系统提示词(选填)",
  8. "history": [
  9. ["第一轮指令(选填)", "第一轮回答(选填)"],
  10. ["第二轮指令(选填)", "第二轮回答(选填)"]
  11. ]
  12. }
  13. ]

5.4 修改data/dataset_info.json文件(重要!!!!!!)

当你把自定义的数据集上传到data目录下之后,需要在dataset_info.json文件中配置

  1. // 在数据集后面新增你添加的自定义数据集的名称和sha1
  2. // 例如:
  3. {
  4. "self_cogition":{
  5. "file_name":"self_cogition.json" //文件名,
  6. "file_sha1":"使用本文档5.2生成的sha1值"
  7. }
  8. }

5.5 运行

python src/train_web.py

5.6 训练

配置好训练内容后点击网页的开始训练

5.7 训练后测试

找到Chat,然后加载模型,测试训练结果

5.8 导出

导出之后,就可以修改大模型路径了(本文档1.5修改api_server.py文件),修改完之后重新运行api_server.py就可以了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/538955
推荐阅读
相关标签
  

闽ICP备14008679号