【“第二课堂”AI实践课堂笔记】:大模型学习

huodaqi666 2024-10-09 08:01:14 阅读 92

一、大模型介绍

大模型是人工智能领域中的一种重要模型,通常指的是具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数,能够在多个领域和任务中展现出强大的泛化能力和自监督学习能力。以下是大模型的概念与特点:

1.1大模型的概念

大模型是指具有大规模参数和复杂计算结构的机器学习模型,它们通过训练海量数据来学习复杂的模式和特征,从而具备更强大的表示能力和泛化能力。大模型在自然语言处理、计算机视觉、语音识别等领域都有广泛的应用,是人工智能发展的重要方向之一。

1.2大模型的主要分类

自然语言处理(NLP)大模型

主要用于处理自然语言文本,如文本分类、命名实体识别、情感分析等。著名模型:GPT-3、BERT等。

计算机视觉(CV)大模型

主要用于处理图像和视频,如目标检测、语义分割、图像生成等。著名模型:Inception、ResNet、DenseNet等。

语音识别(ASR)大模型

主要用于语音信号的处理,如语音识别、语音合成等。著名模型:WaveNet、Transformer等。

推荐系统大模型

主要用于个性化推荐,如商品推荐、内容推荐等。著名算法:Collaborative Filtering、Content-Based Filtering等。

强化学习(RL)大模型

主要用于解决决策问题,如游戏、机器人等。著名模型:Q-learning、Deep Q-Network(DQN)等。

生成对抗网络(GAN)大模型

主要用于生成新的数据,如图像、音频、视频等。著名模型:DCGAN、StyleGAN等。

对话系统大模型

主要用于自然语言对话,如智能客服、智能助手等。著名模型:Rasa、Microsoft Turing-NLG等。

 1.3大模型风险

1.数据泄露风险:大模型在训练过程中需要处理海量数据,这些数据往往包含用户的敏感信息。如果数据保护措施不到位,攻击者可能通过窃取数据或利用漏洞来访问敏感信息,导致数据泄露。

2.版权侵权:大模型在生成内容时,可能会侵犯他人的版权,如未经授权使用他人的作品作为训练数据或生成直接复制他人作品的内容。

3.模型误用:大模型在运营过程中可能会被误用,例如被用于生成恶意软件代码、进行网络攻击等。

二、使用驱动云构建千问模型

2.1环境方面准备

 创建项目,选择B1.medium规格服务器

选择CUDA12.1 PyTorch2.1.1的镜像

在模型中搜索Qwen2-0.5B-Instruct

点击启动后,即可进入环境。

2.2文件上传

下载课前群中发布的大模型.zip文件

在/gemini/code中存放代码,/gemini/pretrain中是我们刚刚挂载的模型。

我们在本地解压大模型应用.zip,得到5个文件,进入/gemini/code目录,将文件拖入窗口完成上传。

2.3相关库的安装

!pip install transformers==4.37.0 -U

!pip install streamlit

使用pip安装来更新或安装特定版本的 transformers 库用于处理和使用各种预训练的深度学习模型,如 BERT、GPT 和其他变换器

在Python环境中安装streamlit库,streamlit是一个非常流行的Python库,用于快速创建和共享数据应用。

2.4设置大模型流程

设置模型加载、分词器初始化、输入消息构建、模型输入准备以及生成文本的大部分流程。

from transformers import AutoModelForCausalLM, AutoTokenizer

device = "cuda" # the device to load the model onto

model = AutoModelForCausalLM.from_pretrained(

"/gemini/pretrain/Qwen2-0.5B-Instruct",

torch_dtype="auto",code>

device_map="auto"code>

)

tokenizer = AutoTokenizer.from_pretrained("/gemini/pretrain/Qwen2-0.5B-Instruct")

prompt = "你是谁?"

messages = [

{"role": "system", "content": "You are a helpful assistant."},

{"role": "user", "content": prompt}

]

text = tokenizer.apply_chat_template(

messages,

tokenize=False,

add_generation_prompt=True

)

model_inputs = tokenizer([text], return_tensors="pt").to(device)code>

generated_ids = model.generate(

model_inputs.input_ids,

max_new_tokens=512

)

generated_ids = [

output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)

]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

print(respons

其中

model = AutoModelForCausalLM.from_pretrained(

"/gemini/pretrain/Qwen2-0.5B-Instruct",

torch_dtype="auto",code>

device_map="auto"code>

)

"/gemini/pretrain/Qwen2-0.5B-Instruct" 是模型的存储路径(可以是本地路径或模型名称)。

torch_dtype="auto"code> 使得 PyTorch 自动选择适当的数据类型(例如,float32 或 float16)。

device_map="auto"code> 使得模型自动映射到指定的设备(例如 GPU)

generated_ids = model.generate(

model_inputs.input_ids,

max_new_tokens=512

)

使用模型生成文本

model_inputs.input_ids 是输入张量。

max_new_tokens=512 限制生成的最大新 token 数量为 512。

2.5流式输出

接下来在test的基础上使用 transformers 库中的模型进行流式文本生成,并处理多轮对话。通过使用线程,模型生成过程不会阻塞主线程,允许实时输出生成的文本。

import torch

from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer

from threading import Thread

device = "cuda"

model_name = "/gemini/pretrain/Qwen2-0.5B-Instruct"

model = AutoModelForCausalLM.from_pretrained(model_name).to(device)

tokenizer = AutoTokenizer.from_pretrained(model_name)

streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)

messages = [

{"role": "system", "content": "You are a helpful assistant."},

]

/root/miniconda3/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html

from .autonotebook import tqdm as notebook_tqdm

Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.

In [2]:

def stream_generate(prompt, model, tokenizer, device):

messages.append({"role": "user", "content": prompt})

text = tokenizer.apply_chat_template(

messages,

tokenize=False,

add_generation_prompt=True

)

model_inputs = tokenizer([text], return_tensors="pt").to(device)code>

generate_params = dict(

inputs=model_inputs.input_ids,

max_new_tokens=512,

do_sample=True,

top_k=50,

temperature=0.7,

pad_token_id=tokenizer.eos_token_id,

streamer=streamer

)

thread = Thread(target=model.generate, kwargs=generate_params)

thread.start()

generated_text = ""

for new_text in streamer:

generated_text += new_text

print(new_text, end='', flush=True)code>

print()

# generated_text

messages.append({"role": "user", "content": generated_text})

In [3]:

# 多轮对话

while True:

user_input = input("User: ")

if user_input.lower() == 'exit':

print("Exiting...")

break

# 生成回复并流式输出

print("Assistant: ", end="")code>

stream_generate(user_input, model, tokenizer, device)

该代码的目的是使用一个预训练的因果语言模型(在这里是 /gemini/pretrain/Qwen2-0.5B-Instruct)来生成对用户输入的响应。代码设计为一个多轮对话系统,其中用户可以输入文本,系统(作为“有帮助的助手”)会生成响应。

2.6使用streamlit框架构建即时问答系统

import streamlit as st

from threading import Thread

import json

import time

from transformers import AutoTokenizer

from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer

import torch

st.title('Qwen2-0.5B-Instruct')

device = "cuda"

model_name = "/gemini/pretrain/Qwen2-0.5B-Instruct"

@st.cache_resource

def get_model():

model = AutoModelForCausalLM.from_pretrained(model_name).to(device)

tokenizer = AutoTokenizer.from_pretrained(model_name)

return model, tokenizer

model, tokenizer = get_model()

streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)

def generate_response(input_text):

prompt = f'''

你是一个智能问答助手,这是你需要回答的问题:

<question>

{input_text}

</question>

'''

print(prompt)

# 构建消息列表

messages = [{"role": "user", "content": prompt}]

text = tokenizer.apply_chat_template(

messages,

tokenize=False,

add_generation_prompt=True

)

model_inputs = tokenizer([text], return_tensors="pt").to(device)code>

generate_params = dict(

inputs=model_inputs.input_ids,

max_new_tokens=512,

do_sample=True,

top_k=50,

temperature=0.7,

pad_token_id=tokenizer.eos_token_id,

streamer=streamer

)

thread = Thread(target=model.generate, kwargs=generate_params)

thread.start()

return streamer

with st.form('my_form'):

text = st.text_area('Enter text:', 'What are the three key pieces of advice for learning how to code?')

submitted = st.form_submit_button('Submit')

if submitted:

message_placeholder = st.empty()

# 调用模型生成响应

streamer = generate_response(text)

response = ""

for text in streamer:

response += text

message_placeholder.info(response + "▌")

message_placeholder.info(response)

Streamlit 是一个开源的 Python 库,用于快速创建和共享数据应用。它允许您使用 Python 编写应用逻辑,并自动将结果渲染为网页。在您的代码中,import streamlit as st 允许您使用 Streamlit 的各种功能,如创建表单、显示文本、图表等。

transformers 库由 Hugging Face 提供,它包含了大量预训练的模型,这些模型可以用于各种自然语言处理任务,如文本生成、分类、命名实体识别等

使用AutoModelForCausalLM 和 AutoTokenizer 来加载一个预训练的因果语言模型(通常用于文本生成)和相应的分词器。

三、Stable Diffusion相关准备

3.1环境准备

与千问二环境准备操作相似

创建项目,选择B1.medium规格服务器

选择CUDA12.1 PyTorch2.1.1的镜像

在模型中搜索Qwen2-0.5B-Instruct

点击启动后,即可进入环境。

3.2执行代码

tar xf /gemini/data-1/stable-diffusion-webui.tar -C /gemini/code/

chmod +x /root/miniconda3/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.2

cd /stable-diffusion-webui && python launch.py --deepdanbooru --share --xformers --listen

解压 Stable Diffusion WebU

tar xf /gemini/data-1/stable-diffusion-webui.tar -C /gemini/code/

这个命令将 /gemini/data-1/stable-diffusion-webui.tar 文件解压到 /gemini/code/ 目录下。tar xf 用于解压 tar 文件,-C 选项指定解压的目标目录。

修改 Gradio 相关的文件权限

chmod +x /root/miniconda3/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.2

为 Gradio 库中的一个可执行文件设置执行权限。Gradio 是一个用于快速创建机器学习和深度学习Web应用的Python库。这个命令假设您已经通过某种方式(可能是 Miniconda)安装了 Gradio,并且希望使该二进制文件可执行。请注意,文件路径 

运行 Stable Diffusion WebUI

cd /stable-diffusion-webui && python launch.py --deepdanbooru --share --xformers --listen

这个命令首先切换到 /stable-diffusion-webui 目录,然后执行 launch.py 脚本来启动 Stable Diffusion WebUI。--deepdanbooru--share--xformers 是传递给 launch.py 的参数,分别可能用于启用 DeepDanbooru 数据集、启用分享功能、以及使用 xformers 库(一个优化后的 transformers 库,用于加速处理)。然而,--listen 参数后面缺少了一个必要的端口号或监听地址。通常,您会想要指定一个端口号,如 --listen 0.0.0.0:7860 来让 WebUI 在所有接口上的 7860 端口上监听。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。