业务场景
AI绘画是近期比较热门的一个应用,其功能主要为可以把用户输入的一段或几段文字,使用训练好的模型来自动生成一幅美丽的画作。
本文以GPU云服务器,型号:GN8为例,实现AI绘画。
相关概念
AI作画已经是一个很早的概念了,简单的说就是利用文本编辑器和图像编辑器来实现自然语言的处理和图像的识别,通过不断的扩散(随机)迭代,再根据已经训练好的模型的权重(weight)评估,最终达到图文一致,达到输出和用户描述词条一致的图像。
只要能输入恰当的描述,AI就能够生成令人意想不到效果的插画。下边给出几个案例:
wombo(有手机APP):
,OpenAI的DALL.E 2 (好像还没有公测):
还有谷歌Colab上的Disco-Diffusion(免费的开源作品):
本文以disco-diffusion为原型,用GPU云服务器,来实现“本地”的AI作画。
源码的git地址:
https://github.com/alembics/disco-diffusion
读者也可以通过技术上网去colab体验:
https://colab.research.google.com/github/alembics/disco-diffusion/blob/main/Disco_Diffusion.ipynb
前提条件
- 购买GPU云服务器(本文使用腾讯GPU计算型GN8)
- 系统:Linux或windows(本文使用 windows server 2019)
- Nvidia显卡驱动以及CUDATookit
- Python 3.70以上(本文使用Python 3.10.4)
操作步骤
- 购买合适的GPU服务器机型,笔者推荐至少选择拥有1颗T4或者以上级别显卡的机器,显卡一定要是N卡。CPU和内存以及带宽和流量这些配置无关紧要,可以选择便宜的来。地域也可以选有优惠标志的区域。如果不是工作需要长期连续使用的朋友,也可以购买竞价实例来低价体验两天。选好配置以后可以直接选择所需要的操作系统,在共有镜像中选择您习惯的操作系统。
- 购买完成后进入控制台查看当前实例的状态:
- 点击登录按钮可以直接进入服务器远程桌面,也可以在本地计算机上连接远程桌面,笔者推荐后者,因为运行起来比较流畅。操作方法见:Windows 系统通过 MSTSC 上传文件到 Windows 云服务器https://cloud.tencent.com/document/product/213/2761
- 进入实例后,会看到服务器管理器的仪表盘,先不用理会这个,直接打开IE输入:http://www.nvidia.com/Download/Find.asp进入N卡驱动官网,根据实际情况填写设备信息
- 关于CUDA的版本,根据本次项目用到的pytorch,可以去官网查询目前的版本:
可以看到最新的支持CUDA 11.3,一般都向下兼容,笔者安全起见选择了11.0,实测选择11.6的版本,也是可以运行的。
- 安装完成后,打开命令行,输入nvidia-smi,可以查看当前版本信息:
如果提示没有指令,可能是安装的时候某个地方忘记勾选ao to path之类的,没有关系,可以手动添加环境变量,操作如下:
右键此电脑,属性,高级系统设置,高级选项卡下的环境变量,在系统变量中找到path,双击进入编辑,新建 C:Program FilesNVIDIA CorporationNVSMI 确定保存。
重启power shell,输入nvidia-smi可正确查看显卡信息了。
- 安装python
用IE访问python官网https://www.python.org/,点击download会弹出一个下载页面,会自动匹配你的系统。
完成下载之后,执行安装
记得勾选Add python to path,安装完成后打开shell执行python命令:
可以看到已经安装成功,并显示了当前的版本信息。
到此,我们的前期准备已经完成了。
- 建立FTP连接(可选),参照Windows 系统通过 FTP 上传文件到云服务器:https://cloud.tencent.com/document/product/213/2132
- 在GPU云服务器中,下载项目所需文件:
项目文件夹,链接:https://share.weiyun.com/c77rJDKm 密码:zyir8j
进入项目目录,
新建models文件夹,用于存放模型
新建init_images文件夹,用于存放初始图片
新建images_out文件夹,用于存放成品图片
下载项目所需的模型(较大),并存放在models目录中
512Model:
https://v-diffusion.s3.us-west-2.amazonaws.com/512x512_diffusion_uncond_finetune_008100.pt
256Model:
https://openaipublic.blob.core.windows.net/diffusion/jul-2021/256x256_diffusion_uncond.pt
secondaryModel:
https://v-diffusion.s3.us-west-2.amazonaws.com/secondary_model_imagenet_2.pth
RN50:
https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt
RN101:
https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt
RN50X4:
https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt
RN50X16:
https://openaipublic.azureedge.net/clip/models/52378b407f34354e150460fe41077663dd5b39c54cd0bfd2b27167a4a06ec9aa/RN50x16.pt
RN50X64
https://openaipublic.azureedge.net/clip/models/be1cfb55d75a9666199fb2206c106743da0f6468c9d327f3e0d0a543a9919d9c/RN50x64.pt
VB32:
https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt
VB16:
https://openaipublic.azureedge.net/clip/models/5806e77cd80f8b59890b7e101eabd078d9fb84e6937f9e85e4ecb61988df416f/ViT-B-16.pt
VL14:
https://openaipublic.azureedge.net/clip/models/b8cca3fd41ae0c99ba7e8951adf17d267cdb84cd88be6f7c2e0eca1737a03836/ViT-L-14.pt
如只需要简单的测试,可以仅选择以下model下载:
(512Model,secondaryModel,RN50X16,VB32,需要在代码模块勾选正确配置的模型,详见最后)
- 安装项目的Python相关依赖:
第一步很重要,打开命令行,输入:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple;
设置国内镜像,可以节约你非常多的时间
之后首先安装训练器torch,这个文件比较大:依次输入:
pip install torch==1.11.0 cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html pip install torchvision==0.12.0 cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
安装完成后,进入项目目录(在命令行输入CD 项目文件夹路径),输入python EvnCheck.py,查看一下:
主要检查torch.cuda.is_available() True是不是True
随后输入pip install opencv-python pandas lpips ftfy regex matplotlib ipywidgets
安装其他项目所需的依赖。
- 运行代码
依赖和models下载完毕之后,打开命令行,进入项目目录,之后输入python app.py可以直接运行程序:
程序首次运行会下载一个VGG的包,耐心等待即可;
运行之中会生成过程的图片已经最终图片到项目的images_out文件夹。
增加扩展操作相关问题
- 关于项目代码和源码的区别
项目中针对源码中含有的动画生成模块,图片生成过程中的快照显示等做了删减,只保留了最简单的图片生成部分。
感兴趣的同学可以查看项目源码进行学习。
- 项目代码中可以更改的参数部分:
app.py中,
第742行:
代码语言:javascript复制diffusion_model = "512x512_diffusion_uncond_finetune_008100" #@param ["256x256_diffusion_uncond", "512x512_diffusion_uncond_finetune_008100"]
diffusion_model 指扩散的模型,可以选256的和512的,512模型的最终图片效果会更精细。如果只是希望做小图,可以使用256x256_diffusion_uncond。
第748-755行:
代码语言:javascript复制ViTB32 = True #@param{type:"boolean"}
ViTB16 = True #@param{type:"boolean"}
ViTL14 = False #@param{type:"boolean"}
RN101 = False #@param{type:"boolean"}
RN50 = True #@param{type:"boolean"}
RN50x4 = False #@param{type:"boolean"}
RN50x16 = True #@param{type:"boolean"}
RN50x64 = False #@param{type:"boolean"}
是CLIP所用到的模型,用于分析自然语言和图片对比,相当于前文中提到的文本模块和图像模块。勾选越多就能越好的识别你所输入的词条,更准确的描绘画卷,当然渲染速度也就越慢。
第786和第804行:
代码语言:javascript复制 'use_fp16': False,
如果是选择T4的机型,请把此选项的值置为True,这个参数指计算时是否用半精度做计算:
可以看到,T4卡支持半精度计算,而且运算速度很高。而笔者选的P40机型并不支持。
代码中813-815行:
代码语言:javascript复制batch_name = 'TimeToDisco' #@param{type: 'string'}
steps = 250 #@param [25,50,100,150,250,500,1000]{type: 'raw', allow-input: true}
width_height = [1024, 768]#@param{type: 'raw'}
batch_name 是图片的名称,可以用户自定义;
steps是扩散的次数,一般250次可以生成一幅很不错的图片,1000次以上就非常精细,当然时间也很长。
width_height是图片的分辨率,可以用户自定义,但是数值请填写256的整数倍数。
第898-900行:
代码语言:javascript复制text_prompts = {
0: ["A painting of Cyberpunk streetscape","Artstation"]
}
此处填写你所需要生成图片描绘的词条,结构可以是:
“A xxx painting of ”:一幅xx类型的画(油画,水彩画等等)
“Castle in the sky”:具象事物的描绘
“Picasso”:参照的画家
“ArtStation”:参照的网站
第902-904行:
代码语言:javascript复制image_prompts = {
# 0:['ImagePromptsWorkButArentVeryGood.png:2',],T
}
此处可以添加你所需要AI参考的底稿的图片路径,AI会根据你提供的原画的基础上,进行渲染;
第908-909行:
代码语言:javascript复制display_rate = 50 #@param{type: 'number'}
n_batches = 3 #@param{type: 'number'}
display_rate是产生图片的频率,此处50代表每50步就保存一个进度图片;
n_batches是你所需要生产这个图片的数量,此处3代表一共会根据用户之前提供的参数,做出3张图片。