Python - AI课程笔记 - 第二部分

1 - Python小总结
2 - Python环境:Anaconda、PyTorch、YOLO
3 - Python - AI课程笔记 - 第一部分
4 - Python - AI课程笔记 - 第二部分

第一部分内容过多,拆分第二部分单独记录 大模型重点

图片测试

1、
在这里插入图片描述
2、
在这里插入图片描述

day25-大模型

2025-01-10

简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Transformers 不是大模型,是构成大模型的组件。

# `大`模型?
- 大语言模型
- Large Language Models (LLMs)
- 参数量:B Billion 十亿
- 1. 类脑设计:参数看作脑细胞,脑细胞越多,越聪明
- 2. 数学视角:y=F(x), 参数看作自变量,自变量越多,函数越复杂,越能映射复杂的关系
- 训练平台:
- 工程上:不可能脱离GPU,而且需要高性能GPU!
- 万卡平台
- 训练数据:
- 预训练:18T语料(3600万本红楼梦量级)
- 训练时长:
- 原来:3~6个月
- 现在:1~2个月

------------------------------------------------------------------------------------------------

# `质`的变化
- 本质:话说天下大势,分久必合,合久必分。
- 1. 小模型时代:
- 单一职责原则:
- 一个场景:
- 单独一个模型
- 单独一个数据集
- 单独训练
- 单独评估
- 单独部署
- 单独维护
- 一个系统:
- 挂了很多微服务
- 挂了很多的小模型
- 2. 大模型时代:
- 大一统
- 一个系统:
- 挂了一个大模型
- 通过指令遵循,可以同时解决不同的问题!!!
- 多模态大模型

------------------------------------------------------------------------------------------------

# 大语言模型的架构:
- 架构1:Encoder-Decoder 架构(完全淘汰了)
- 直接把 Transformer 变厚即可!
- T5:Text to Text transfer Transformer
- Google
- 最正确、最正统、最没有歧义的路线!!!
- 首次提出:`指令编码`的基础理念
- 复杂

- 架构2:Decoder-Only 架构(主流架构!!!)
- 把模型的复杂度降低!
- 除了GLM之外,这种架构是唯一的!
- LLaMA 架构(LLaMA2)
- 千问系列(*****)
- 豆包
- 星火
- kimi
- ...

- 架构3:GLM(Prefix-Encoder-Only)架构
- 融合BERT和GPT的优势,提出了一种混合结构!
- 1. 理解上文:双向编码器的优势(BERT)
- 2. 生成下文:强大的自回归能力(GPT)

------------------------------------------------------------------------------------------------

聊天模型-案例

1、安装命令

1
2
3
4
5
6
1. transformers依赖安装
conda install -y transformers

2. 模型准备
- 模型地址 https://www.modelscope.cn/models/charent/ChatLM-mini-Chinese
- 在当前文件同级目录 执行 git clone https://www.modelscope.cn/charent/ChatLM-mini-Chinese.git

2、main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
# huggingface 核心库
# conda install -y transformers
from transformers import AutoTokenizer # 加载分词器
from transformers import AutoModelForSeq2SeqLM # 加载 Seq2Seq 类型的大模型
import torch # 深度学习框架

# 创建一个服务
app = FastAPI()

# 自定义一个参数接受类
class Param(BaseModel):
question: str

class ResultEntity(BaseModel):
result: str

# 模型准备
# 1. 模型地址 https://www.modelscope.cn/models/charent/ChatLM-mini-Chinese
# 2. 在当前文件同级目录 执行 git clone https://www.modelscope.cn/charent/ChatLM-mini-Chinese.git
model_id = 'ChatLM-mini-Chinese'
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForSeq2SeqLM.from_pretrained(model_id, trust_remote_code=True).to(device)

@app.get("/predict2")
def predict2(q: Union[str, None] = None):
# txt = '请把下面的话翻译为英语:你好吗?'
# txt = '你吃过饭了吗?'
txt = q
encode_ids = tokenizer([txt])

input_ids = torch.LongTensor(encode_ids['input_ids'])
attention_mask = torch.LongTensor(encode_ids['attention_mask'])

outs = model.my_generate(
input_ids=input_ids.to(device),
attention_mask=attention_mask.to(device),
max_seq_len=512,
search_type='beam'
)

outs_txt = tokenizer.batch_decode(outs.cpu().numpy(), skip_special_tokens=False, clean_up_tokenization_spaces=False)
# print(outs_txt[0])
return ResultEntity(result=outs_txt[0])

# 创建一个路由
@app.post("/predict")
def predict(param: Param):
return predict2(param.question)

# 启动服务(不用命令启动 "fastapi dev xxx.py", 可直接 main 方法运行。)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=18019)

3、client.py

1
2
3
4
5
6
7
8
9
10
import requests

data = {
"question": "你是人吗?"
}

url = "http://127.0.0.1:18019/predict"

response = requests.post(url, json=data)
print(response.json()) # {'result': '[PAD]是的,我是一个计算机程序,被设计用于回答各种问题和提供帮助。我可以回答各种类型的问题,包括科学、技术、历史、文化和娱乐等方面的问题。我的设计初衷是为了帮助人们更快、更方便地获取信息和进行交流。\n然而,随着技术的不断进步,我的回答变得越来越复杂和难以理解。我使用了各种算法和技术,包括机器学习、自然语言处理、计算机视觉和深度学习等,这些技术使我能够更好地理解和回答用户提出的问题。此外,我还在不断学习和进化,以更好地满足用户的需求和期望。\n总的来说,我的设计旨在为用户提供快速、准确和有用的信息,帮助他们更好地解决问题和完成任务。我的目标是为用户提供最佳的帮助和支持,帮助他们实现他们的梦想。[EOS]'}

4、测试

1
2
3
4
5
6
1. 先启动 main.py
2. 再启动 client.py - 返回数据
3. 浏览器访问 http://127.0.0.1:18019/predict2?q=你是人吗
{
"result": "[PAD]是的,[UNK]你是我的名字。我是一个计算机程序,被设计用于回答用户提出的问题和提供信息。我的目的是通过自然语言处理技术和机器学习算法来帮助用户更好地理解和回答他们的问题。\n我可以回答各种问题,从简单的问题到复杂的问题,我可以回答与我的专业领域相关的问题,例如历史、科学、技术、文化和社会问题。我还可以帮助用户找到他们所需要的信息,并提供相关的建议和指导,以帮助他们更好地完成他们的任务。\n如果您有任何其他问题或需要帮助,请随时告诉我。我将竭诚为您服务。[EOS]"
}