赞
踩
DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动,我很感兴趣就参加啦。之前就对chatGLM有所耳闻,是去年清华联合发布的开源大语言模型,可以用来打造个人知识库什么的,一直没有尝试。而SD我前两天刚跟着B站秋叶大佬和Nenly大佬的视频学习过,但是生成某些图片显存吃紧,想线上部署尝试一下。
参考:DataWhale 学习手册链接
本文以趋动云平台为例,详细介绍下如何通过平台提供的在线开发环境,直接在云端编写、运行代码,并使用**GPU资源进行加速**。本教程将学习云算力资源的使用方式,并给出了两个AI项目实践:
平台注册:
适用人群:
优势:
无需进行本地环境配置,简单易用,便于分享和协作。
**组织方:**Datawhale x 趋动云
ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。
推理速度比上一代提高了很多,虽然本教程有两种启动方式,但教程作者强烈推荐使用streamlit体验,效果极佳。
本项目采用 趋动云 云端配置,环境采用 Pytorch2.0.1、python3.9、cuda11.7
的镜像,在公开模型选择 葱姜蒜上传的这个ChtaGLM3-6B模型 。
资源配置采用拥有24G显存的 B1.large ,最好设置一个最长运行时间,以免忘关环境,导致资源浪费。我这里选择了24h的最长运行时间。
成功配置好项目基本资源后,就可以进入JupyterLab开发环境了。现在需要在终端进一步配置环境,通过我们选择的模型资源中的加载的文件,我们首先要设置镜像源、克隆ChatGLM项目。
升级apt,安装unzip
apt-get update && apt-get install unzip
设置镜像源,升级pip
git config --global url."https://gitclone.com/".insteadOf https://
pip config set global.index-url https://pypi.virtaicloud.com/repository/pypi/simple
python3 -m pip install --upgrade pip
克隆项目,并进入项目目录
git clone https://github.com/THUDM/ChatGLM3.git
cd ChatGLM3
安装项目依赖与peft
可以先把requirements.txt中的torch删掉,避免重复安装
pip install -r requirements.txt
pip install peft
通过以上步骤,项目环境已部署完成啦。但是为了防止下次加载还得重新装载镜像,此时可以将镜像封装发布。
点击右上角将当前环境制作为镜像
填写镜像名称,构建镜像
填写自定义镜像名称后,在Dockerfile中,填写以下内容,以之前选择的基础镜像,创建镜像。
RUN apt-get update && apt-get install unzip
RUN git config --global url."https://gitclone.com/".insteadOf https://
RUN pip config set global.index-url https://pypi.virtaicloud.com/repository/pypi/simple
RUN python3 -m pip install --upgrade pip
RUN pip install accelerate==0.27.2 \
aiofiles==23.2.1 \
altair==5.2.0 \
annotated-types==0.6.0 \
arxiv==2.1.0 \
blinker==1.7.0 \
colorama==0.4.6 \
cpm-kernels==1.0.11 \
dataclasses-json==0.6.4 \
distro==1.9.0 \
fastapi==0.110.0 \
feedparser==6.0.10 \
ffmpy==0.3.2 \
gitdb==4.0.11 \
GitPython==3.1.42 \
gradio==4.21.0 \
gradio_client==0.12.0 \
greenlet==3.0.3 \
h11==0.14.0 \
httpcore==1.0.4 \
httpx==0.27.0 \
huggingface-hub==0.21.4 \
jsonpatch==1.33 \
jupyter_client==8.6.0 \
langchain==0.1.11 \
langchain-community==0.0.27 \
langchain-core==0.1.30 \
langchain-text-splitters==0.0.1 \
langchainhub==0.1.15 \
langsmith==0.1.23 \
latex2mathml==3.77.0 \
loguru==0.7.2 \
markdown-it-py==3.0.0 \
marshmallow==3.21.1 \
mdtex2html==1.3.0 \
mdurl==0.1.2 \
openai==1.13.3 \
orjson==3.9.15 \
packaging==23.2 \
peft==0.9.0 \
protobuf==4.25.3 \
pydantic==2.6.3 \
pydantic_core==2.16.3 \
pydeck==0.8.1b0 \
pydub==0.25.1 \
PyJWT==2.8.0 \
python-multipart==0.0.9 \
regex==2023.12.25 \
requests==2.31.0 \
rich==13.7.1 \
ruff==0.3.2 \
safetensors==0.4.2 \
semantic-version==2.10.0 \
sentence-transformers==2.5.1 \
sentencepiece==0.2.0 \
sgmllib3k==1.0.0 \
shellingham==1.5.4 \
smmap==5.0.1 \
SQLAlchemy==2.0.28 \
sse-starlette==2.0.0 \
starlette==0.36.3 \
streamlit==1.32.0 \
tenacity==8.2.3 \
tiktoken==0.6.0 \
timm==0.9.16 \
tokenizers==0.15.2 \
toml==0.10.2 \
tomlkit==0.12.0 \
transformers==4.38.2 \
typer==0.9.0 \
typing_extensions==4.10.0 \
urllib3==2.2.1 \
uvicorn==0.28.0 \
watchdog==4.0.0 \
websockets==11.0.3 \
zhipuai==2.0.1
等待镜像构建
在开发环境实例中修改镜像
在构建的项目中,点击右边栏的 开发 ,点击 修改挂载镜像 ,在 我的 里选择刚才创建的镜像。
Gradio是一个开源的Python库,用于创建机器学习模型的交互式界面。其中,StableDiffusion的WebUI就是通过 Gradio 开发。
修改模型目录
将 basic_demo
文件夹中的 web_demo_gradio.py
的模型加载路径改为 /gemini/pretrain
修改启动路径
将代码最后一行的启动代码修改为如下代码。
demo.queue().launch(share=False, server_name="0.0.0.0",server_port=7000)
添加外部端口映射
在界面的右边添加外部端口:7000
运行gradio界面
返回终端,输入以下指令,运行 web_demo_gradio.py
cd basic_demo
python web_demo_gradio.py
等待模型慢慢加载完毕,即可访问gradio页面。
访问gradio页面
加载完毕之后,复制外部访问的连接,到浏览器打打开
打开后界面如下,可以再input输入框进行问答测试。
可以看到,Gradio界面并不稳定,回答的结果有点"抽风",回复中夹杂指令字符<|im_end|>
与 <|im_start|>
,并且出现了自问自答的现象。
配置好环境后,再次访问,在终端输入以下指令直接运行 gradio 。
cd ChatGLM3/basic_demo python web_demo_gradio.py
- 1
- 2
如果你运行了gradio,需要先杀掉这个进程,不然内存不够。
CTRL+C 可以杀掉进程
Streamlit是一个开源的Python库,它允许用户 快速创建 交互式的数据科学和机器学习Web应用程序。
与Gradio相比,Streamlit在用户体验设计上更为通用,适合广泛的应用场景,而Gradio则更专注于展示和交互机器学习模型。
根据以下步骤,创建 streamlit 交互界面。
修改模型目录
将 basic_demo
文件夹中的 web_demo_streamlit.py
的模型加载路径改为 /gemini/pretrain
运行streamlit界面
在终端输入以下指令,运行web_demo_stream.py并指定7000端口,这样就不用再次添加外部端口映射啦~
streamlit run web_demo_streamlit.py --server.port 7000
访问streamlit界面
复制外部访问地址到浏览器打开,之后模型才会开始加载。(不复制在浏览器打开是不会加载的!)
出现以上界面,等待加载,加载结束后工作台后端画面如下。可以在输入框提问。
可以看到,streamlit界面的问答,比Gradio的问答稳定的多,没有多余的符号与自问自答。
配置好环境后,再次访问,在终端输入以下指令直接运行 streamlit 。
cd ChatGLM3/basic_demo streamlit run web_demo_streamlit.py --server.port 7000
- 1
- 2
可以看到,chatGLM侧边栏有三行可调节参数,其功能分别如下:
下面分别测试以上3个方面对生成文本的影响。
max_length决定了模型生成文本的最大长度。于是本次测试决定让模型回答固定长度的答案,一次超过max_length,一次没有对比其对生成文本的影响。
max_length较大时,生成500字的作文
可以看到成功生成了一篇大约500字的作文。
max_length较小时,生成500字的作文
可以看到,max_length有效的控制了生成的字数,当要求生成的字数小于max_length,生成的文章将会被截断。
Top P影响着文本的多样性。即值越大用词越丰富,值越少越词穷。本次测试让模型生成一个旅游规划,对比不同Top P的值对生成文本的影响。
Top_P较大时,生成泰山旅游行程
Top_P较小时,生成泰山旅游行程
可以看到,在Top P值较大时,生成的旅游规划较为详细,每日都有不同的行程。而Top P较小时,生成的旅游规划十分简单,而且还出现了 “专线 bus”、"泰山 train"这种不伦不类的用词。
Temperature控制着生成文本的随机性。即值越小回答越死板,值越大回答越丰富。这个参数和Top P其实有点相似,经过查阅资料得知:
当 temperature 设置为较高值(接近1或大于1)时,模型在选择下一个 token 时,会倾向于选择概率较低的选项,从而产生更具创新性和多样性的输出。
当 temperature 设置为较低值(接近0但大于0)时,模型在选择下一个 token 时,会更偏向于选择概率较高的选项,从而产生更准确、更确定性的输出。
所以,本次选择一个大语言模型表现不太的领域——数学,来考察 temperature 对生成文本的影响。
Temperature较大时,对年龄计算题的回答
Temperature较小时,对年龄计算题的回答
可以看到,当 temperature 值较大时,回答的答案有推理思路,联想能力强,得到了正确的回答,而 temperature 值较小时,回答仅仅把题干中两个数字相加,未能理解题目的真正含义,死板的回复了错误的答案。
创建项目
在趋动云用户工作台中,点击 快速创建 ,选择 创建项目,创建新项目。
镜像配置
选择 趋动云小助手 的 AUTOMATIC1111/stable-diffusion-webui
镜像。
数据集配置
在 公开 数据集中,选择 stable-diffusion-models
数据集。
配置完成后,点击创建,要求上传代码时,选择 暂不上传 。
初始化开发环境
找到最右侧 “开发”-> “初始化开发环境实例”,我这里没按教程配置,因为SD生图需要较大显存,我选择了拥有24G显存的 B1.large,其他按教程一样,并设置了24h的最长运行时间。
因为数据集代码有所变化,所以教程中有些步骤可以省略,以下为具体步骤。
解压代码及模型
tar xf /gemini/data-1/stable-diffusion-webui.tar -C /gemini/code/
拷贝frpc内网穿透文件
chmod +x /root/miniconda3/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.2
拷贝模型文件到项目目录下
cp /gemini/data-1/v1-5-pruned-emaonly.safetensors /gemini/code/stable-diffusion-webui/
更新系统httpx依赖
pip install httpx==0.24.1
运行项目
cd /gemini/code/stable-diffusion-webui && python launch.py --deepdanbooru --share --xformers --listen
运行项目后,点击右侧添加,创建 外部访问链接 。
访问StableDiffusion的WebUI
复制外部访问链接,在浏览器粘贴并访问,就成功打开WebUI界面啦。
生成镜像
点击右上角 将当前环境制作为镜像,点击 智能生成,在 AUTOMATIC1111/stable-diffusion-webui
基础镜像下生成,点击 构建,完成对镜像的构建。
之后安装上一章的步骤,将镜像配置到你的项目里就好啦。
配置好环境后,再次访问,在终端输入以下指令直接运行 WebUI 。
cd /gemini/code/stable-diffusion-webui && python launch.py --deepdanbooru --share --xformers --listen
- 1
生成第一张美图
部署好了当然是要生成一张图,我选择生成一张猫猫图,结果如下。
库自带的模型是 v1-5-pruned-emaonly
模型,这个模型是官方的1.5 版本预训练模型,是在512*512的小尺寸图像上训练的,所以说如果图像尺寸超过1000的话,容易出现多头多人的情况。
在这里我选择的参数与提示词如下:
提示词(prompt):
1 cat
负面提示词(Negative prompt):
out of frame,(worst quality, low quality, normal quality:2),text,bad eyes,weird eyes closed eyes,badhandv4:0.8,OverallDetail,render,bad quality,worst quality,signature,watermark,extra limbs,
迭代步数(Steps)、采样器(Sampler)、提示词相关性(CFG scale):
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 7,
随机种子(Seed)、图像尺寸(Size)、模型(Model)
Seed: 3052626755, Size: 384x512, Model hash: 6ce0161689, Model: v1-5-pruned-emaonly, Version: v1.6.0
生成的猫猫图如下:
批量生成
我想要更多的猫猫图,于是增大了生成的 Batch Count
和Batch size
,生成结果如下。
可以看到一下生成了16张猫猫图,它实际上是分了两批,每批生成8张,这样生成的。Batch count
控制了生成批次的数量,Batch size
控制每批生成图片的数量。Batch size
越大对显卡显存要求越高,当然白嫖的24g显存不在话下了。
可以看到生成的图像各有千秋,甚至有的生成了个房子(太离谱了),所以选择合适的种子很重要。可以通过批量生成找到自己喜欢的图像风格的种子,固定下来进行进一步操作。
我很喜欢第四张,大脸狸花猫,于是点开图片,可以在图片下方看到种子号 2617670965
。
图像放大
我想放大刚才选中的大脸狸花猫图,可以通过固定种子,并通过 Hires fix
的方法放大生成图像。
我想使用一个名为 R-ESRGAN4x 的放大算法,从云平台下载太慢了,选择从 该github链接 本地下载,并放在/gemini/code/stable-diffusion-webui/models/RealESRGAN/RealESRGAN_x4plus.pth
路径下。
设置以下参数,重新生成,结果如下。
成功将图像尺寸放大到原来的两倍,即 768*1024 的尺寸。图像参数如下:
1 cat
Negative prompt: out of frame,(worst quality, low quality, normal quality:2),text,bad eyes,weird eyes closed eyes,badhandv4:0.8,OverallDetail,render,bad quality,worst quality,signature,watermark,extra limbs,
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 7, Seed: 2617670965, Size: 384x512, Model hash: 6ce0161689, Model: v1-5-pruned-emaonly, Denoising strength: 0.35, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+, Version: v1.6.0
猫猫图如下:
效果还不错,不过我还想让他更清晰一点,于是选择让他放大4倍,结果如下。
可以看到,真的清晰了不少。
图生图
图生图就是以给的图片为基准,生成其他的图片,我就像用刚才生成的猫猫图,来生成一个宇宙的星系,于是写了以下的提示词。
stars,out space,galaxy,
负面提示词不变,分两个批次生成16张星系图片,结果如下。
可以看到,生成了具有猫猫形状的星系图案,我从中挑了一张最喜欢的,就是下面这张。
图片参数如下:
stars,out space,galaxy,
Negative prompt: out of frame,(worst quality, low quality, normal quality:2),text,bad eyes,weird eyes closed eyes,badhandv4:0.8,OverallDetail,render,bad quality,worst quality,signature,watermark,extra limbs,
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 3, Seed: 3318537879, Size: 768x1024, Model hash: 6ce0161689, Model: v1-5-pruned-emaonly, Denoising strength: 0.7, Version: v1.6.0
以上就尝试玩SD的基本功能啦,之后可以再玩一些进阶玩法,用更厉害的模型,添加lora、ControlNet等插件,生成更可控好看的图片。
因为云平台版本原因,没办法直接安装插件、模型,会以下报错。
于是只能靠自己上传文件,或者从公共平台找合适的数据集。从公共数据集可以找到这个数据集,里面有许多常用的 扩展 和 模型 ,如常用的 麦橘真实majicmixRealistic v7.safetensor
。
还有这个数据集,里面也有许多插件。
或者可以自己上传数据集,通过STFP上传文件。
这时候,就可以通过其他模型来绘制更好看的图像,比如输入以下提示词,绘制图像如下。
1 girl,happy,real,
Negative prompt: out of frame,(worst quality, low quality, normal quality:2),text,bad eyes,weird eyes closed eyes,OverallDetail,render,bad quality,worst quality,signature,watermark,extra limbs, bad-hands-5,bad_prompt_version2-neg
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 2, Seed: 2137894007, Size: 768x1024, Model hash: 7c819b6d13, Model: majicmixRealistic_v7, Version: v1.6.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。