由【让你拥有专属且万能的AI摄影师 AI修图师——FaceChain迎来最大版本更新】这篇文章开始出发进行人脸写真的尝试,笔者之前modelscope申请过免费额度,这里有适配的GPU环境可以提供测试。 但是很难抢到GPU资源,需要等待很久,可能才能排到。
1 所需环境与资源要求
FaceChain是一个组合模型,使用了包括PyTorch和TensorFlow在内的机器学习框架,以下是已经验证过的主要环境依赖:
- python环境: py3.8, py3.10
- pytorch版本: torch2.0.0, torch2.0.1
- tensorflow版本: 2.8.0, tensorflow-cpu
- CUDA版本: 11.7
- CUDNN版本: 8
- 操作系统版本: Ubuntu 20.04, CentOS 7.9
- GPU型号: Nvidia-A10 24G
资源要求
- GPU: 显存占用约19G
- 磁盘: 推荐预留50GB以上的存储空间
2 环境部署
2.1 环境部署
因为使用的是免费额度的环境,目前暂不提供永久存储,实例重启后数据会丢失 官方教程里面有:
代码语言:javascript复制# Step1: 我的notebook -> PAI-DSW -> GPU环境
# Step2: 进入Notebook cell,执行下述命令从github clone代码:
!GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/modelscope/facechain.git --depth 1
# Step3: 切换当前工作路径
import os
os.chdir('/mnt/workspace/facechain') # 注意替换成上述clone后的代码文件夹主路径
print(os.getcwd())
!pip3 install gradio
!pip3 install controlnet_aux==0.0.6
!pip3 install python-slugify
!python3 app.py
# Step4: 点击生成的URL即可访问web页面,上传照片开始训练和预测
不过,github访问看脸,有时候链接不上,需要手动去github下载facechain了
一些辅助依赖也是需要安装的,可参考:facechain_demo.ipynb
2.2 遇到的几个报错
2.2.1 frpc_linux_amd64_v0.2 报错
启动facechain,并在选择风格的时候碰到了以下报错:
代码语言:javascript复制Could not create share link.
Missing file: /xxxx/frpc_linux_amd64_v0.2.
参考:基于docker快速搭建facechain环境 一种方式是手动添加这个文件,因为modelspace启动的pai-dsw可能不能访问huggingface网站
代码语言:javascript复制wget https://cdn-media.huggingface.co/frpc-gradio-0.2/frpc_linux_amd64
mv frpc_linux_amd64 frpc_linux_amd64_v0.2
mv frpc_linux_amd64_v0.2 /home/miniconda3/envs/llm/lib/python3.11/site-packages/gradio
chmod x frpc_linux_amd64_v0.2 // 注:要给该文件执行权限,否则会报3.3错误
但是呢,笔者又发现,这个问题其实可以忽略,后台自己还是可以正常install,属于一个很无厘头的提示报错
2.2.2 style 报错
在选择风格的时候出现的报错,正常选择之后,会出现上面的一个提示框,【秋日胡杨风(xxx)】,但笔者这里出现了:
代码语言:javascript复制indexerror:list index out of range
经过debug才发现app.py
的51行函数,出现了一个无厘头的报错,首先evt.value
是一个list,[风格图片,风格名称]
,这里需要指定风格名称,需要改成evt.value[1]
# 原先的
def select_function(evt: gr.SelectData):
matched = list(filter(lambda item: evt.value == item['name'], styles))
style = matched[0]
return gr.Text.update(value=style['name'], visible=True)
# 需要修改
def select_function(evt: gr.SelectData):
matched = list(filter(lambda item: evt.value[1] == item['name'], styles))
style = matched[0]
return gr.Text.update(value=style['name'], visible=True)
也是很无语的一个问题…