Implementación localizada del modelo de lenguaje grande ChatGLM

Implementación localizada del modelo de lenguaje grande ChatGLM

ChatGLM-6B es un modelo de lenguaje de diálogo bilingüe chino-inglés de código abierto basado en la arquitectura del Modelo de lenguaje general (GLM) con 6200 millones de parámetros. En combinación con la tecnología de cuantificación de modelos, los usuarios pueden implementar localmente en tarjetas gráficas de consumo (solo se requieren 6 GB de memoria de video en el nivel de cuantificación INT4). ChatGLM-6B utiliza una tecnología similar a ChatGPT, optimizada para preguntas y respuestas y diálogos en chino.

preparación preliminar

Paquete básico de GitHub

GitHub: ChatGLM-6B

下载 ChatGLM-6B 压缩包到本地

Por favor agregue una descripción de la imagen

archivo de modelo de lenguaje

Abrazando la cara: Modelo

下载 训练好的 语言模型文件

Por favor agregue una descripción de la imagen

每一个都要下载

Por favor agregue una descripción de la imagen

Configuracion basica

解压 ChatGLM-6B-main.zip 文件

Por favor agregue una descripción de la imagen

新建一个名为 model 的文件夹

Por favor agregue una descripción de la imagen

把刚才在 Hugging Face 上下载的所有文件都放进来
应该是 20 个 检查一下

Por favor agregue una descripción de la imagen

返回 ChatGLM-6B-main 跟目录 找到名为 web_demo.py 的文件

Por favor agregue una descripción de la imagen

可以用记事本 或则 其他工具打开

Por favor agregue una descripción de la imagen

更改第 45行代码
原本代码:
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
修改过后代码:
tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
model = AutoModel.from_pretrained("model", trust_remote_code=True).half().quantize(4).cuda()
就是把 THUDM/chatglm-6b 更改为 model
并在 half()方法之后添加 quantize(4) 方法

Por favor agregue una descripción de la imagen

量化需求:
如果显存小于14G 就使用 quantize(4) 方法 如果你要使用 quantize(8)你就要关闭所有应用
说一下我的电脑配置:i7、16G内存、2060ti显卡(6G显存)
各位看官老爷自己对比一下

inserte la descripción de la imagen aquí

Método de visualización de la memoria de video

Win + R 键 打开命令窗口
输入 dxdiag 然后点击确认

Por favor agregue una descripción de la imagen

打开系统自带的诊断工具之后 随便点一个显示

Por favor agregue una descripción de la imagen

这个显示内存就是你的 显存

Por favor agregue una descripción de la imagen

Módulos de anaconda

Sitio web oficial de Anaconda: Sitio web oficial de Anaconda

Implementación de la página web ChatGLM-6B

Creación del entorno Anaconda

打开 Anaconda 点击 Environments

Por favor agregue una descripción de la imagen

新建一个环境

Por favor agregue una descripción de la imagen

起一个名字
注意:记住 Python 版本 有点重要 最好使用 3.10.10
如果没有可以在官网重新下载 更新一下

Por favor agregue una descripción de la imagen

点击那个运行按钮 并打开 Open Terminal

inserte la descripción de la imagen aquí

operación del directorio raíz

输入 D: 进入相应硬盘

Por favor agregue una descripción de la imagen

使用 cd 命令 进入到 ChatGML 根目录
我这边是 D:\Unity\ChatGLM-6B\ChatGLM-6B-main
大家根据自己的 解压路径进行 打开

Por favor agregue una descripción de la imagen

Carga de dependencia básica

键入 pip install -r requirements.txt
加载依赖项 反正我这边是会加载不完全

Por favor agregue una descripción de la imagen

Carga de librería de transformers y protobuf

下载 protobuf 和 transformers 库支持
pip install protobuf==3.20.0 transformers==4.27.1 icetk cpm_kernels

Por favor agregue una descripción de la imagen

因为要使用 Web 显示 所以也需要加载 gradio库
pip install gradio

Por favor agregue una descripción de la imagen

先启动跑一下看看 能不能运行的起来 万一可以呢 是吧
python web_demo.py

Por favor agregue una descripción de la imagen

Modificación de la fuente Pytorch

Pitorca: Pitorca

报错:AssertionError: Torch not compiled with CUDA enabled
这个就是 只支持 CPUCUDR 问题不大
去 Pytorch 找到对应的 直接 conda

Por favor agregue una descripción de la imagen

注意选择对啊
如果conda 实在是卡的不能行的话  你就试试 pip
两个命令都给你:

conda: conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

Por favor agregue una descripción de la imagen
Por favor agregue una descripción de la imagen

当出现这一句的时候 你直接 输入 y 回车就行

Por favor agregue una descripción de la imagen

Suplemento de biblioteca de dependencia

下载完毕之后你会发现 还是缺少依赖库 找到相应名称
比如这个 chardet 直接 pip install
pip install chardet

Por favor agregue una descripción de la imagen

再次运行 python web_demo.py 命令

Por favor agregue una descripción de la imagen

好吧 果然不可以  缺少 cchardet库
那就继续下载呗
pip install cchardet

Por favor agregue una descripción de la imagen

来了来了 全场最大的麻烦来了
明明下载都下载好了 就是无法执行 你气不气

Por favor agregue una descripción de la imagen

找了一百年 重新下载也不行 换成清华源 也不行
最后的最后 就想着要不换下轮子呢

Por favor agregue una descripción de la imagen

Dependencia suplementaria en la configuración de pypi

pypi: sitio web oficial de pypi

在搜索框输入 你想要查询库名称

Por favor agregue una descripción de la imagen

注意选择对应的 系统 我是 win64 所以就选择了第一个
这里还有一个坑

Por favor agregue una descripción de la imagen

cd 到你存放 刚刚下载文件的目录

Por favor agregue una descripción de la imagen

resolución de errores de dependencia de cchardet

输入 pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp39-cp39-win_amd64.whl
这是我的路径 各位 自行更改哈
然后你会发现 又错了!!!
不能用 完犊子 真的差点吐血 好在是解决了

Por favor agregue una descripción de la imagen

回到下载文件夹 各位还记得 自己创建环境时的 Python 版本吗 对 就是那个!
原本名称是 cp39 改成 cp310 就能用了
真真不想吐槽了

Por favor agregue una descripción de la imagen

你要是不知道自己环境对应的 就输入:
pip debug --verbose
按照对应的更改一下就行了

Por favor agregue una descripción de la imagen

执行 pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp310-cp310-win_amd64.whl

Por favor agregue una descripción de la imagen

成功 毫无悬念

Por favor agregue una descripción de la imagen

cd 到ChatGLM 根目录
cd D:\Unity\ChatGLM-6B\ChatGLM-6B-main

Por favor agregue una descripción de la imagen

再次运行 python web_demo.py
发现还是不行 那还说什么  上大招

Por favor agregue una descripción de la imagen

normalización forzada

强制 最新归一化
pip install --force-reinstall charset-normalizer==3.1.0

Por favor agregue una descripción de la imagen

再次启动
python web_demo.py
搓手等待...

Por favor agregue una descripción de la imagen

Página web implementada con éxito

天见犹怜 终于终于 成功了
真是一波三折 再三折 好在是成功了

Por favor agregue una descripción de la imagen

好了大家可以尽情的调教自己的 GPT

Por favor agregue una descripción de la imagen

Implementación local de ChatGLM-6B

Terminal Anaconda

在上面创建好的环境下 重新打开 执行 Terminal 

inserte la descripción de la imagen aquí

导航到 根目录

Por favor agregue una descripción de la imagen

carga de dependencia

使用 pip install fastapi uvicorn 命令安装相关 依赖

Por favor agregue una descripción de la imagen

modificación del archivo api.py

在根目录找到 api.py 文件并打开

Por favor agregue una descripción de la imagen

初始代码:这两句在 5354
	tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
	model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
更改为下面的:稍微解释一下。
因为我的模型放在了根目录的 model 文件夹下 所以把 "THUDM/chatglm-6b" 更改为了 "model"
你们也可以按需更改。
    tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
    model = AutoModel.from_pretrained("model", trust_remote_code=True).half().cuda()
可以直接替换的完整代码:
from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModel
import uvicorn, json, datetime
import torch

DEVICE = "cuda"
DEVICE_ID = "0"
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE


def torch_gc():
    if torch.cuda.is_available():
        with torch.cuda.device(CUDA_DEVICE):
            torch.cuda.empty_cache()
            torch.cuda.ipc_collect()


app = FastAPI()


@app.post("/")
async def create_item(request: Request):
    global model, tokenizer
    json_post_raw = await request.json()
    json_post = json.dumps(json_post_raw)
    json_post_list = json.loads(json_post)
    prompt = json_post_list.get('prompt')
    history = json_post_list.get('history')
    max_length = json_post_list.get('max_length')
    top_p = json_post_list.get('top_p')
    temperature = json_post_list.get('temperature')
    response, history = model.chat(tokenizer,
                                   prompt,
                                   history=history,
                                   max_length=max_length if max_length else 2048,
                                   top_p=top_p if top_p else 0.7,
                                   temperature=temperature if temperature else 0.95)
    now = datetime.datetime.now()
    time = now.strftime("%Y-%m-%d %H:%M:%S")
    answer = {
    
    
        "response": response,
        "history": history,
        "status": 200,
        "time": time
    }
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)
    torch_gc()
    return answer


if __name__ == '__main__':
    tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
    model = AutoModel.from_pretrained("model", trust_remote_code=True).half().cuda()
    model.eval()
    uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)

api.py se ejecuta

执行命令:python api.py

Por favor agregue una descripción de la imagen

Localización implementada con éxito

可以自己设置访问网址和端口 只要设置好就行。
我这边直接使用的是默认的:http://127.0.0.1:8000 或者 http://0.0.0.0:8000

Por favor agregue una descripción de la imagen

Enviar módulo Unity de datos Json

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 发送 数据
/// </summary>
[System.Serializable]
public class PostDataJson_ZH 
{
    
    
    /// <summary>
    /// 发送信息
    /// </summary>
    public string prompt;
    /// <summary>
    /// 细节
    /// </summary>
    public List<string> history;
}

Reciba el módulo Unity de datos Json

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 接收 数据
/// </summary>
[System.Serializable]
public class AcceptJson_ZH 
{
    
    
    /// <summary>
    /// 返回消息
    /// </summary>
    public string response;
    /// <summary>
    /// 多个回答
    /// </summary>
    public List<List<string>> history;
    /// <summary>
    /// 状态
    /// </summary>
    public int status;
    /// <summary>
    /// 返回事件
    /// </summary>
    public string time;
}

Integración de la unidad

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class ChatGLM_ZH : MonoBehaviour
{
    
    
    [Header("本地化访问网址")]
    public string _OpenAIUrl= "http://127.0.0.1:8000";

    [Header("基础模板设置")]
    [SerializeField]
    public PostDataJson_ZH _PostData = new PostDataJson_ZH();

    [Header("接收数据")]
    public string _RobotChatText;

    [Header("问题")]
    public string _SendMessage= "你好";


    void Update()
    {
    
    
        if (Input.GetKeyDown(KeyCode.Q))
        {
    
    
            _SendMessage = GameObject.Find("输入").GetComponent<InputField>().text;
            StartCoroutine(GetPostData(_SendMessage));
        }
    }

    /// <summary>
    /// POST 方法请求
    /// </summary>
    /// <param 问题="_SendMessage"></param>
    /// <returns></returns>
    private IEnumerator GetPostData(string _SendMessage)
    {
    
    
        using (UnityWebRequest _Request = new UnityWebRequest(_OpenAIUrl, "POST"))
        {
    
    
            //{"prompt": "你好", "history": []}

            _PostData.prompt = _SendMessage;

            //数据转换
            string _JsonText = JsonUtility.ToJson(_PostData);
            print(_JsonText);

            byte[] _Data = System.Text.Encoding.UTF8.GetBytes(_JsonText);
            //数据上传 等待响应
            _Request.uploadHandler = new UploadHandlerRaw(_Data);
            _Request.downloadHandler = new DownloadHandlerBuffer();


            //数据重定向
            _Request.SetRequestHeader("Content-Type", "application/json");

            //等待响应 开始与远程服务器通信
            yield return _Request.SendWebRequest();

            //数据返回
            if (_Request.responseCode == 200)
            {
    
    
                //接收返回信息
                string _Message = _Request.downloadHandler.text;

                print(_Message);

                //数据转换
                AcceptJson_ZH _Textback = JsonUtility.FromJson<AcceptJson_ZH>(_Message);

                //确保当前有消息传回
                if (_Textback.response != null)
                {
    
    
                    //输出显示
                    _RobotChatText = _Textback.response;

                    GameObject.Find("输出").GetComponent<Text>().text = _RobotChatText;
                }
            }
        }
    }
}

Efecto de ejecución de localización

命令行 输出

Por favor agregue una descripción de la imagen

Unity 输出

Por favor agregue una descripción de la imagen

Usar una colección de URL

GitHub: ChatGLM-6B
Cara abrazada: Modelo
Anaconda Sitio web oficial: Sitio web oficial de Anaconda
Pytorch: Pytorch
Pypi: pypi Sitio web oficial
Universidad de Tsinghua Sitio web espejo: Universidad de Tsinghua Sitio web espejo

Colección de comandos de ejecución

//基础包依赖加载
pip install -r requirements.txt

//transformers 和 protobuf 依赖加载
pip install protobuf==3.20.0 transformers==4.27.1 icetk cpm_kernels

//网页使用 gradio 库 加载
pip install gradio

//网页 启动命令
python web_demo.py

//CPU 转换
conda: conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

//chardet 库 补充依赖
pip install chardet

//cchardet 库 补充依赖
pip install cchardet

//查看当前平台支持的版本
pip debug --verbose

//cchardet 库 轮子 加载
pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp310-cp310-win_amd64.whl

//强制 最新归一化
pip install --force-reinstall charset-normalizer==3.1.0

//启动命令
python web_demo.py


//本地化 依赖加载
pip install fastapi uvicorn

//本地化 启动命令
python api.py

//断开服务
Ctrl + C

//清华源 镜像
核心句式:-i https://pypi.tuna.tsinghua.edu.cn/simple
例如下载的是:cchardet
正常下载是:pip install cchardet
清华源下载是:pip install cchardet -i https://pypi.tuna.tsinghua.edu.cn/simple

Hagamos esto por ahora. Si tiene tiempo, actualizará el artículo de ajuste fino del modelo y se tomará el tiempo para actualizar la implementación de GLM130B. Si realmente no entiende, deje un mensaje. Le responderé cuando vea él.
El camino es largo y el camino es largo, animemos juntos.

Supongo que te gusta

Origin blog.csdn.net/weixin_43925843/article/details/130235719
Recomendado
Clasificación