构建集成环境,解锁高效实时绘画的游戏美术新体验!

063d6118b51d94b8c57506ff981fa24a.gif

前言

传统上,要制作一张高质量的游戏美术图像,美术人员需要投入大量时间。随着Stable Diffusion和Flux等高质量生成式AI大模型的出现,通过文生图、图生图等生成式AI技术,结合模型微调,我们可以显著提升游戏美术的工作效率。

本文将介绍如何利用开源免费的绘图软件Krita,结合ComfyUI的功能来提高美术创作效率。

a59bb2cc2e147350e4604c523a55c187.png

如上图所示,通过Krita的AI插件,我们可以将传统绘图功能与生成式AI能力无缝结合。美术人员可以在数位板上实时绘画,同时观察生成式AI生成的图像效果,快速调整创意方向。

创作者可以通过提示词(Prompt)和参考图来精确控制图像生成效果,从而高效完成绘画和设计工作。

关于Krita

Krita是一款功能强大且完全免费的开源数字绘画软件,旨在为艺术家提供一个无障碍的创作平台。目前Krita支持在Windows、MacOS和Linux操作系统使用。

软件特点

1.自由开源:Krita遵循GNU GPL许可证,确保用户可以自由使用、修改和分发软件,而不受商业限制。

2.多功能绘画工具:Krita提供了丰富的绘画功能,包括:

  • 强大的笔刷引擎,支持多种绘画风格。

  • 图层管理、绘画辅助工具和笔刷防抖功能,帮助用户实现精细的绘画效果。

  • 动画制作工具,支持多图层动画和音频导入。

3.用户友好的界面:Krita的界面可高度定制,用户可以根据自己的需求调整面板布局和快捷键,以提高创作效率。

4.社区支持:Krita拥有一个活跃的国际社区,用户可以在论坛中分享作品、讨论创作经验,并与开发者直接交流。

关于ComfyUI

ComfyUI是基于Stable Diffusion的图像生成工具,采用节点式工作流设计,具有以下特点:

1.高效的图像生成

  • ComfyUI在图像生成速度上优于传统的WebUI,适合需要快速生成图像的用户。

  • 显存占用较低,即使在显存有限的情况下也能有效运行。

2.高度可定制的工作流

  • 用户可以创建和复用自定义工作流,通过节点连接实现复杂的图像生成过程。

  • 支持导入和导出工作流,便于分享和学习。

3.扩展性和社区支持

  • ComfyUI允许用户开发自定义节点,社区贡献了大量自定义节点,极大丰富了功能选择。

  • 尽管学习曲线较陡,但其灵活性和可玩性吸引了许多高级用户。

4.实时反馈和调试

通过节点式设计,用户可以实时查看生成过程中的每个步骤,便于调试和优化工作流。

Krita适合需要手绘和复杂图层管理的艺术创作,提供了丰富的工具和灵活的工作环境;而ComfyUI则更适合快速生成图像和需要高度定制化的用户,尤其在生成式AI绘画和图像处理方面表现突出。

本文会介绍如何通过Krita结合ComfyUI实现非常高效的实时绘画,并带大家一起来构建在Amazon EC2上的ComfyUI环境。整体架构信息如下所示:

235040f90a3b80b0992a33d52d834021.png

架构说明

本方案中暴露了一系列API给到外部进行调用完成Amazon EC2创建维护等,其中使用的重要组件列举如下:

  • Amazon EC2:用来部署ComfyUI服务。

  • Amazon EFS:存储全局、不同部门、不同用户的Custom Nodes以及Model。

  • Amazon DynamoDB:管理Custom Nodes以及服务器-用户的mapping信息。

  • Amazon API Gateway、Amazon Lambda:通过Amazon API gateway和Amazon Lambda来暴露外部调用API。

  • Amazon Eventbridge:监听Amazon EC2的状态并调用Amazon Lambda来修改Amazon DynamoDB中Amazon EC2的状态信息。

整个方案中使用的基本都是无服务器架构,其中Amazon EC2启动之后会监控针对GPU的使用率。一旦一段时间没有使用后就会被停止,待下一次用户使用时再启动。

安装Krita

在Krita官网下载后直接安装完后,下载生成式AI插件krita-ai-diffusion,进行安装。

404fcb0ebc6fd6de710872b88cb03e0d.jpeg

安装完毕后,在Krita的右下角可以看到插件信息。

4690116d89139c1bc70c8f11bdcf1356.jpeg

krita-ai-diffusion

https://github.com/Acly/krita-ai-diffusion/releases/

方案部署

下面我们开始部署整体方案。

Amazon EC2 AMI制作

1. 使用Ubuntu系统来制作Amazon EC2 Image,或者直接使用已经安装好环境的官方Ubuntu镜像,本文采用第一种。

首先我们需要在亚马逊云科技控制台来启动一台Ubuntu系统的Amazon EC2,Amazon EC2的安全组需要开放22以及8848端口,EBS选择gp3, 200G。

2.安装Amazon CLI。

sudo apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

左右滑动查看完整示意

3.安装Nvidia驱动。

按照亚马逊云科技官网来安装驱动,打开下面的网页,选择Option4:Nvidia Gaming Driver。一定要安装下面的包,不然会导致Amazon EC2重启后GPU Driver不能正常工作:

sudo apt-get install -y nvidia-cuda-toolkit
sudo apt-get install -y ubuntu-drivers-common
sudo ubuntu-drivers autoinstall
sudo reboot

左右滑动查看完整示意

Nvidia Gaming

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#nvidia-gaming-driver

Driver

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html#nvidia-gaming-driver

4. 安装Amazon Cloudwatch Agent。

下载Amazon Cloudwatch Agent后,使用以下命令启动,

Agent.json文件参考下面内容:

文件目录:/home/ubuntu/cloudwatch-agent/agent.json

{
  "metrics": {
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "nvidia_gpu": {
        "measurement": [
          "utilization_gpu",
          "utilization_memory",
          "memory_total",
          "memory_used",
          "memory_free"
        ],
        "metrics_collection_interval": 30
      }
    }
  }
}
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/home/ubuntu/cloudwatch-agent/agent.json -s

左右滑动查看完整示意

Amazon Cloudwatch Agent

https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

5.安装Amazon EFS Driver。

sudo apt-get update
sudo apt-get -y install git binutils rustc cargo pkg-config libssl-dev
git clone https://github.com/aws/efs-utils
cd efs-utils
./build-deb.sh
sudo apt-get -y install ./build/amazon-efs-utils*deb

左右滑动查看完整示意

6.安装ComfyUI服务。

此处不需要创建为系统服务,在后面的方案中会自动创建,下面的命令会自动安装Comfy Manager的custom node。

# ubuntu根目录下执行以下命令, 根据本地python3版本调整
sudo apt install python3.12-venv
python3 -m venv venv
. venv/bin/activate
pip install comfy-cli
comfy install # 一路“Y”下去
#启动服务
/home/ubuntu/venv/bin/python3 /home/ubuntu/comfy/ComfyUI/main.py --listen 0.0.0.0 --port 8848

左右滑动查看完整示意

7.安装Krita需要的Custom Nodes。

按照Krita AI插件的介绍ComfyUI Setup,需要安装以下Custom Nodes:

  • ComfyUI Nodes for External Tooling

  • ComfyUI’s ControlNet Auxiliary Preprocessors

  • ComfyUI_IPAdapter_plus

  • Inpaint Nodes

我们可以通过Comfy Manager中的Custom Nodes Management来下载安装。

e2ed1ff9ef01761ab7196752efebe8d3.jpeg

ComfyUI Setup

https://github.com/Acly/krita-ai-diffusion/wiki/ComfyUI-Setup

8.下载测试模型。

wget https://github.com/Acly/krita-ai-diffusion/releases/download/v1.22.0/krita_ai_diffusion-1.22.0.zip
unzip krita_ai_diffusion-1.22.0.zip
cd ai_diffusion/
pip3 install aiohttp tqdm
python3 download_models.py /home/ubuntu/comfy/ComfyUI --recommended # 注意ComfyUI Home

左右滑动查看完整示意

9.安装完毕后,测试当前环境是否正常,显示“Connected”则为正常

10.至此Amazon EC2环境已经完备,停止Amazon EC2,制作Image,制作完毕后,请记录一下AMI的ID,以备后续使用。

9bd159426b9b670634638886ded5854e.jpeg

Amazon CDK部署环境

创建部署用Amazon EC2(推荐t3.large,仅作为部署短期使用),默认使用Amazon Linux 2023,赋予必要Amazon IAM Role角色权限,涉及权限如下:Amazon VPC、Amazon EC2、Amazon EFS、Amazon API Gateway、Amazon Lambda、Amazon DynamoDB、Amazon EventBridge创建权限。

安装Amazon CDK。

Amazon CDK

https://docs.aws.amazon.com/cdk/v2/guide/home.html

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 
source ~/.bashrc 
nvm --version 
nvm install 20 
nvm use 20 
node -v 
npm -v 
npm install -g aws-cdk
cdk --version

左右滑动查看完整示意

下载部署代码。

yum install git -y
git clone https://github.com/aws-samples/using-EC2-build-Krita-with-ComfyUI-practice.git

左右滑动查看完整示意

修改配置,进行部署。

cd using-EC2-build-Krita-with-ComfyUI-practice/
vim gen_env.sh
# 打包好的comfyui ubuntu的 AMI ID, 请务必替换成我们自己的AMI ID, 此处需要注意不同机型的AMI有可能不适配,请一定一定要使用指定机型的AMI
EC2_AMI_ID='ami-0633a0cxxxx'
# EC2 key pair name, 请务必替换成我们自己的EC2 Key Name
EC2_KEY_NAME='west'
# EC2 实例类型, 默认为: g6.2xlarge
EC2_INSTANCE_TYPE='g6.2xlarge'
# DynamoDB Table 名称, 用户分配的ComfyUI服务器信息, 默认为: user-comfyui-servers
USER_COMFYUI_SERVERS_TABLE='user-comfyui-servers'
# DynamoDB Table 名称, Custom Nodes信息, 默认为: comfyui_custom_nodes
COMFYUI_CUSTOM_NODES_TABLE='comfyui_custom_nodes'
# 指定自己的VPC CIDR
VPC_CIDR='10.0.0.0/16'
# 指定机器闲置时间,单位为分钟
SERVER_IDLE_TIME='30'

左右滑动查看完整示意

修改完毕后,执行下面代码:

sh gen_env.sh
npm install
cdk bootstrap
cdk deploy

左右滑动查看完整示意

等待大约十多分钟后,部署完毕。

3a68644b318821c3e03e5df3207e979f.jpeg

检查Amazon CloudFormation。

da4e21404428fa5159f3a1129fb8d824.jpeg

根据“APIKeyARN”获取“APIKeyID”,格式如下:

arn:aws:apigateway:region::/apikeys/{api-key-id}

根据“apikeyid”获取“apikey”。

aws apigateway get-api-key --api-key {api-key-id} --include-value --query "value" --output text

记录下InvokeUrl、APIKey、FileBroswerInstanceIP。

使用Postman测试接口

下载测试.json文件。

测试.json文件

https://github.com/aws-samples/using-EC2-build-Krita-with-ComfyUI-practice/blob/main/postman/ComfyUI-Servers.postman_collection.json

导入到Postman,定义环境变量api-key用上面的APIKey赋值,URL用InvokeUrl赋值。

9256387fe68be7232677a239c242e529.jpeg

/ComfyUI-Servers一共有三个接口:

  • Post接口,根据userid创建和启动 ComfyServer。

7590ef8a6cad5ed5830202e369f4e631.jpeg

  • Get接口,根据username查询ComfyServer状态以及对外暴露的IP和Port,直接配置在Krita中进行使用。

1f699920e3e63999b9436b15d3ebc2f7.jpeg

  • Stop管理接口,根据username,group_name停止ComfyServer。

01d2c517e5fec6a7e487425797c8ff80.jpeg

/ComfyUI-Servers/custom_nodes一共有四个接口,分别对应查询、创建、更新、删除。

  • Post接口,创建 custom_nodes。

{
  "node_name": "ComfyUI Inspire Pack",
  "node_type": "global",
  "group_name": "group1",
  "repo_url": "https://github.com/example/repo.git",
  "status": "available",
  "creator": "user1"
}

左右滑动查看完整示意

3219fb16cad0aee96ff7c83e9250b4d6.jpeg

  • 通过ID获取custom_node。

c0a13b13422401bda1910baeff28bfbb.jpeg

  • 通过ID更新custom_node。

{
  "node_name": "ComfyUI Inspire Pack",
  "node_type": "global",
  "group_name": "group1",
  "repo_url": "https://github.com/ltdrdata/ComfyUI-Inspire-Pack.git",
  "status": "available"
}

左右滑动查看完整示意

66e528f61b38b03af134762324486e3d.jpeg

  • 通过ID删除custom_node。

06d790b5a36a923299a34eaf10e8ae46.jpeg

模型管理

模型是通过Amazon EFS进行共享,分为“global”和“group”模型。

48e46b09a69c8287b61cecfc57110d4d.jpeg

e78465f30e26d835420ffa888b68b891.jpeg

File browser管理模型

通过使用FileBroswerInstanceIP地址打开管理界面,使用默认账号密码登录admin/admin,默认工作目录是/home/ec2-user/EFS/。

dfa0fc7261c0e2b014e40f020f1da56d.jpeg

models目录结构为:

global,{groups}/{group_name},{users}/{username};

output目录结构为:

 {output_dir}/{group_name}/{username};

可以通过设置界面修改admin登录密码,和默认工作目录。

8428f9e9f06a2852f1031b982e6c3ec6.jpeg

模型上传

  • 通过“comfyui manager”下载模型到指定文件夹。

  • 使用file browser上传,路径在 /home/ec2-user/EFS/models/checkpoints/global/。

  • 通过密钥登录file browser服务器进行更新。

cd /home/ec2-user/EFS/models/checkpoints/global/
wget -O sd_xl_base_1.0.safetensors https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors?download=true

左右滑动查看完整示意

从FileBrowser使用命令下载模型

首先将“wget”、“curl”等常用文件下载和管理命令设置为允许在FileBrowser中使用。

点击左侧配置按钮。

e8131239a66fe1a35c0f0760ea04699e.jpeg

再点击用户管理,选择需要赋予命令权限的用户,点击铅笔图标。

7b74851d89e69bf9c7915b23144e30d0.jpeg

滑动到画面下端的用户命令(Shell命令),添加ls、wget、curl、rm、cp、mv等文件操作命令,注意命令之间使用半角空格分割。编辑完成后点击保存按钮。

ee7ff110741aac525d7310ed9b5face3.jpeg

返回文件操作界面,点击右上角的“<>”图标,开启terminal。

4314e61b1ad025c88f9864695df02329.jpeg

在页面下半部分的terminal执行各种文件管理命令,来下载和管理模型文件。

e22f3b29224fd3fdcd86f9e7ada44cc4.jpeg

关键代码解析

comfyui_servers_post.py。

1.创建Amazon EC2的逻辑。

result = query_comfyui_servers_by_username(username) # 获取用户之前是否创建过EC2
if result: # 如果已有EC2,则将其启动
    print(f"Username:{username} already has a comfyui server")
    for item in result:
        instance_id = item['instance_id']
        response = ec2_client.describe_instances(InstanceIds=[instance_id])
        instance_status = response['Reservations'][0]['Instances'][0]['State']['Name']
        if instance_status == 'stopped':
            start_instance(instance_id=instance_id, idle_time=idle_time)
            update_status(username=username, instance_id=instance_id, status='starting')
        else:
            return {
                "statusCode": 400,
                "body": json.dumps({"message": f"Can not start instance_id: {instance_id}, current status:{instance_status}", "code": 400})
            }
else: # 若之前没有EC2,则为其创建信息的EC2
    print(f"Username:{username} doesn't have a comfyui server, now create a new one.")
    instances = create_instance(username=username, group_name=group_name, idle_time=idle_time)
    instance_id = instances[0].id

左右滑动查看完整示意

2.获取用户配置的custom nodes并组装安装命令。

repo_list = get_custom_nodes_by_type('global')
    # Convert repo_list to a string for the user data script
    repo_clone_commands = "\n".join([
        f"""
        if [ ! -d {comfyui_home_dir}/custom_nodes/{repo['repo_url'].split('/')[-1].replace('.git', '')} ]; then
            git clone {repo['repo_url']} {repo.get('extra_parameter', '')} {comfyui_home_dir}/custom_nodes/{repo['repo_url'].split('/')[-1].replace('.git', '')} &&
            if [ -f {comfyui_home_dir}/custom_nodes/{repo['repo_url'].split('/')[-1].replace('.git', '')}/requirements.txt ]; then
                source /home/ubuntu/venv/bin/activate && pip install -r {comfyui_home_dir}/custom_nodes/{repo['repo_url'].split('/')[-1].replace('.git', '')}/requirements.txt;
            fi
        else
            echo "Repository {repo['repo_url']} already cloned."
        fi
        """
        for repo in repo_list
    ])
    print(repo_clone_commands)

左右滑动查看完整示意

3.使用user data精准挂载当前用户的group以及自身下载的模型。

user_data_script = f"""#!/bin/bash
    echo "---------user data start-----------"
    # Mount EFS
    if [ ! -d "{ec2_start_script_dir}" ]; then
        mkdir -p {ec2_start_script_dir}
    fi
    mount -t efs -o tls,iam,accesspoint={access_point_start_script_id} {file_system_id}:/{username} {ec2_start_script_dir}
    echo "{file_system_id}:/{username} {ec2_start_script_dir} efs _netdev,tls,iam,accesspoint={access_point_start_script_id} 0 0" >> /etc/fstab
    chmod +x {ec2_start_script_dir}/mount.sh
    bash {ec2_start_script_dir}/mount.sh
    
    # Create User Output Dir
    if [ ! -d "{user_output_dir}" ]; then
        mkdir -p {user_output_dir}
    fi


    # Custom Nodes Clone
    {repo_clone_commands}
    chown -R ubuntu:ubuntu {comfyui_home_dir}/custom_nodes/*


    # Set Comfyui as system service
    cat << EOF > /etc/systemd/system/comfyui.service
    [Unit]
    Description=ComfyUI Service
    After=network.target


    [Service]
    User=root
    WorkingDirectory=/home/ubuntu/comfy/ComfyUI
    ExecStart=/home/ubuntu/venv/bin/python3 main.py --listen 0.0.0.0 --port {comfyui_server_port} --output-directory {user_output_dir}
    Restart=always


    [Install]
    WantedBy=multi-user.target
EOF
    # start comfyui as system service
    systemctl daemon-reload
    systemctl enable comfyui.service
    systemctl start comfyui.service
    echo "---------user data end-----------"
    """

左右滑动查看完整示意

4.设置CloudWatch metrics以及alarm一旦超过一段时间没有用Amazon EC2,则直接关机。

def put_alarm_metric_alarm(instance_id, idle_time):
    gpu_info = next((item for item in INSTANCE_GPU if item['instance'] == instance_type[:2]), None)
    put_response = cw.put_metric_alarm(
        AlarmName=f'{alarm_name_prefix}{instance_id}',
        ComparisonOperator='LessThanThreshold',
        EvaluationPeriods=int(idle_time),
        MetricName='nvidia_smi_utilization_gpu',
        Namespace='CWAgent',
        Period=60,
        Statistic='Maximum',
        Threshold=1.0,
        ActionsEnabled=True,
        AlarmActions=[f'arn:aws:swf:{region}:{account_id}:action/actions/AWS_EC2.InstanceId.Stop/1.0'],
        AlarmDescription=f'Alarm when GPU utilization is low for {idle_time} minutes',
        Dimensions=[
            {
                'Name': 'InstanceId',
                'Value': instance_id
            },
            {
                'Name': 'name', 
                'Value': gpu_info['gpu']
            },
            {
                'Name': 'index', 
                'Value': '0'
            },
            {
                'Name': 'arch', 
                'Value': gpu_info['arch']
            }
        ],
        TreatMissingData='notBreaching' #没有数据的点不不触发告警.
    )
    print(f'Alarm reset response: {put_response}')

左右滑动查看完整示意

总结

本篇文章探讨了如何在Amazon EC2上构建Krita与ComfyUI的集成环境,以实现高效的实时绘画。

通过使用无服务器架构,结合Amazon API Gateway和Amazon Lambda,我们实现了对ComfyUI服务的管理和监控,确保用户可以方便地创建和管理自己的绘画环境。

常见问题

执行命令 nvidia-smi 报错如下:

Failed to initialize NVML: Driver/library version mismatch; 

通过以下方案:

sudo apt-get --purge remove "*nvidia*"

之后重新安装 Driver,

查看日志:

systemctl status comfyui # 查看服务状态
journalctl -f -u comfyui # 查看服务日志

本篇作者

04813b4cd74d717eae3975bce6189c80.jpeg

郭俊龙

亚马逊云科技解决方案架构师,主要负责游戏行业客户解决方案设计,比较擅长云原生微服务以及大数据方案设计和实践。

3598811448a7350db36f588f81385509.jpeg

陈汉卿

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案的咨询、架构设计及落地,拥有多年移动互联网研发经验,在云原生微服务以及云迁移等方向有丰富的实践经验。

a189d5794f9d7aa9178cb73a57c42c38.jpeg

秦镜高

亚马逊云科技资深解决方案架构师,负责基于亚马逊云科技云计算方案的架构设计,帮助客户利用领先的云服务技术构建更具创新性的应用。

5a57a66df7edcc08dc48b22ab9c27d21.jpeg

刘硕

亚马逊云科技客户解决方案经理,在亚马逊云科技主要支持游戏和零售等行业的用户。专注于促进亚马逊云科技用户解决方案落地,提升上云体验,帮助用户实现自身的业务价值。

67cc769be9ab6062e7e1a28d902d7913.png

9737c477f7daec2c8bf6955a158addc0.png

a591fd345e43ac7e50c91e6e22277ebe.jpeg

365d4c490dcd93ea5ab3ce8b9fcfb82a.png

45fa5c0da02c1787bc0a28b6af5e686b.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

5065dbde25b6584a6cd50adedc1077ab.gif

点击阅读原文查看博客!获得更详细内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值