ADD 增加HeyGem APP
ADD 增加包含HeyGem的ComfyUI APP
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
# ComfyUI模板--Base Auth Heygem
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import traceback
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
from typing import Dict
|
||||
|
||||
import modal
|
||||
@@ -13,14 +11,14 @@ from fastapi import Depends, HTTPException, status
|
||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||
|
||||
image = ( # build up a Modal Image to run ComfyUI, step by step
|
||||
modal.Image.from_registry( # start from basic Linux with Python
|
||||
"ubuntu/python:3.12-24.04_stable"
|
||||
).apt_install("python3.8-dev")
|
||||
modal.Image.debian_slim( # start from basic Linux with Python
|
||||
python_version="3.10"
|
||||
)
|
||||
.apt_install("git") # install git to clone ComfyUI
|
||||
.apt_install("gcc")
|
||||
.apt_install("libportaudio2")
|
||||
.pip_install("fastapi[standard]==0.115.4") # install web dependencies
|
||||
.pip_install("comfy-cli==1.3.8") # install comfy-cli
|
||||
.pip_install("comfy-cli==1.3.5") # install comfy-cli
|
||||
.pip_install("cos-python-sdk-v5")
|
||||
.pip_install("sqlalchemy")
|
||||
.pip_install("ultralytics")
|
||||
@@ -56,7 +54,7 @@ image = (
|
||||
.run_commands("comfy node install https://github.com/cubiq/ComfyUI_essentials")
|
||||
.run_commands("comfy node install https://github.com/melMass/comfy_mtb")
|
||||
.run_commands("echo 3 && comfy node install https://e.coding.net/g-ldyi2063/dev/ComfyUI_SparkTTS.git")
|
||||
.run_commands("echo 1 && comfy node install https://e.coding.net/g-ldyi2063/dev/ComfyUI-CustomNode.git")
|
||||
.run_commands("echo 4 && comfy node install https://e.coding.net/g-ldyi2063/dev/ComfyUI-CustomNode.git")
|
||||
.run_commands("comfy node install https://e.coding.net/g-ldyi2063/dev/cosyvoice_comfyui.git")
|
||||
.run_commands("echo 4 && comfy node install https://e.coding.net/g-ldyi2063/dev/ComfyUI-LatentSync-Node.git")
|
||||
.run_commands(
|
||||
@@ -75,9 +73,17 @@ image = (
|
||||
"apt update && apt install -y ffmpeg && ffmpeg -version"
|
||||
).add_local_file("config.yaml", "/root/comfy/ComfyUI/custom_nodes/ComfyUI-CustomNode/config.yaml", copy=True
|
||||
).add_local_file("config.py", "/root/comfy/ComfyUI/custom_nodes/cosyvoice_comfyui/pretrained_models/tools/config.py", copy=True
|
||||
).add_local_file("heygem-1.0-py3-none-any.whl","/root/comfy/heygem-1.0-py3-none-any.whl", copy=True
|
||||
).add_local_file("heygem.py", "/root/comfy/heygem.py", copy=True
|
||||
).pip_install("/root/comfy/heygem-1.0-py3-none-any.whl")
|
||||
) # 添加Python3.8 HeyGem
|
||||
.run_commands("apt update && apt install -y curl build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev lzma liblzma-dev tk-dev libffi-dev")
|
||||
.run_commands("curl -O https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz&&tar -xf Python-3.8.12.tar.xz")
|
||||
.run_commands("cd Python-3.8.12 && ./configure --enable-optimizations && make -j 10 && make altinstall")
|
||||
.add_local_file("heygem-1.0-py3-none-any.whl","/root/comfy/heygem-1.0-py3-none-any.whl", copy=True)
|
||||
.shell(["/bin/bash", "-c"])
|
||||
.run_commands("python3.8 -m pip install /root/comfy/heygem-1.0-py3-none-any.whl")
|
||||
.env({"LD_LIBRARY_PATH":"/usr/local/lib/python3.8/site-packages/nvidia/cuda_nvrtc/lib"})
|
||||
.run_commands("ln -s /usr/local/lib/python3.8/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.so.11.2 /usr/local/lib/python3.8/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.so")
|
||||
.run_commands("python3.8 -m pip install https://github.com/pydata/numexpr/releases/download/v2.8.6/numexpr-2.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl")
|
||||
.add_local_file("heygem.py", "/root/comfy/heygem.py", copy=True)
|
||||
.workdir("/root/comfy")
|
||||
|
||||
# Add .run_commands(...) calls for any other custom nodes you want to download
|
||||
@@ -101,13 +107,12 @@ auth_scheme = HTTPBearer()
|
||||
buffer_containers=0,
|
||||
scaledown_window=120,
|
||||
# 5 minute container keep alive after it processes an input; increasing this value is a great way to reduce ComfyUI cold start times
|
||||
timeout=900,
|
||||
timeout=1200,
|
||||
gpu=["L4", "T4"],
|
||||
cpu=(2,16),
|
||||
# memory=(32768, 32768), # (内存预留量, 内存使用上限)
|
||||
memory=(20480,40960),
|
||||
retries=1,
|
||||
enable_memory_snapshot=True,
|
||||
memory=(20480,81920),
|
||||
enable_memory_snapshot=False,
|
||||
secrets=[secret, modal.Secret.from_name("web_auth_token")],
|
||||
volumes={
|
||||
"/root/comfy/ComfyUI/models": vol,
|
||||
@@ -134,8 +139,10 @@ class ComfyUI:
|
||||
" && rm -rf /root/comfy/ComfyUI/user"
|
||||
" && mkdir -p /root/comfy/ComfyUI/output_s3/logs/{}"
|
||||
" && ln -s /root/comfy/ComfyUI/output_s3/logs/{} /root/comfy/ComfyUI/user"
|
||||
" && comfy launch --background"
|
||||
" && nohup python heygem.py >> /root/comfy/ComfyUI/output_s3/logs/{}/heygem.log 2>&1 &").format(self.session_id,self.session_id, self.session_id, self.session_id)
|
||||
" && nohup python3.8 /root/comfy/heygem.py >> /root/comfy/ComfyUI/output_s3/logs/{}/heygem.log 2>&1 &"
|
||||
).format(self.session_id,self.session_id, self.session_id, self.session_id)
|
||||
subprocess.run(cmd, shell=True, check=True)
|
||||
cmd = "comfy launch --background"
|
||||
subprocess.run(cmd, shell=True, check=True)
|
||||
|
||||
@modal.method()
|
||||
@@ -170,41 +177,78 @@ class ComfyUI:
|
||||
node["inputs"]["default_value"] = node["inputs"]["default_value"].replace("input_s3", "input")
|
||||
with open(f"/root/{self.prompt_uuid}.json", "w", encoding="utf-8") as fi:
|
||||
fi.write(json.dumps(workflow, ensure_ascii=False))
|
||||
cmd = f"comfy run --workflow /root/{self.prompt_uuid}.json --wait --timeout 890 --verbose"
|
||||
subprocess.run(cmd, shell=True, check=True, timeout=895)
|
||||
cmd = f"comfy run --workflow /root/{self.prompt_uuid}.json --wait --timeout 1190 --verbose"
|
||||
subprocess.run(cmd, shell=True, check=True, timeout=1195)
|
||||
|
||||
# looks up the name of the output image file based on the workflow
|
||||
file_prefix = [
|
||||
node.get("inputs")
|
||||
for node in workflow.values()
|
||||
if node.get("class_type") == "VHS_VideoCombine"
|
||||
][0]["filename_prefix"]
|
||||
if "VHS_VideoCombine" in workflow_json:
|
||||
file_prefix = [
|
||||
node.get("inputs")
|
||||
for node in workflow.values()
|
||||
if node.get("class_type") == "VHS_VideoCombine"
|
||||
][0]["filename_prefix"]
|
||||
|
||||
# returns the image as bytes
|
||||
file_list = os.listdir(output_dir)
|
||||
# 获取按照文件时间创建排序的列表,默认是按时间升序
|
||||
new_file_list = sorted(file_list, key=lambda file: os.path.getctime(os.path.join(output_dir, file)),
|
||||
reverse=True)
|
||||
# print("file_list", new_file_list)
|
||||
for f in new_file_list:
|
||||
if f.startswith(file_prefix):
|
||||
os.makedirs(os.path.dirname(os.path.join(output_dir.replace("output", "output_s3"), f)), exist_ok=True)
|
||||
# returns the image as bytes
|
||||
file_list = os.listdir(output_dir)
|
||||
# 获取按照文件时间创建排序的列表,默认是按时间升序
|
||||
new_file_list = sorted(file_list, key=lambda file: os.path.getctime(os.path.join(output_dir, file)),
|
||||
reverse=True)
|
||||
# print("file_list", new_file_list)
|
||||
for f in new_file_list:
|
||||
if f.startswith(file_prefix):
|
||||
os.makedirs(os.path.dirname(os.path.join(output_dir.replace("output", "output_s3"), f)), exist_ok=True)
|
||||
try:
|
||||
shutil.copy(os.path.join(output_dir, f), os.path.join(output_dir.replace("output", "output_s3"), f))
|
||||
except:
|
||||
try:
|
||||
print("Try move file to S3 manually")
|
||||
# S3 Fallback
|
||||
import boto3
|
||||
import yaml
|
||||
with open("/root/comfy/ComfyUI/custom_nodes/ComfyUI-CustomNode/config.yaml", encoding="utf-8",mode="r+") as config:
|
||||
yaml_config = yaml.load(config, Loader=yaml.FullLoader)
|
||||
awss3 = boto3.resource('s3', aws_access_key_id=yaml_config["aws_key_id"],
|
||||
aws_secret_access_key=yaml_config["aws_access_key"])
|
||||
awss3.meta.client.upload_file(os.path.join(output_dir, f), bucket_output, f)
|
||||
except:
|
||||
raise Exception("Failed to move file to S3 manually")
|
||||
return f
|
||||
elif "HeyGemF2F" in workflow_json or "HeyGemF2FFromFile" in workflow_json:
|
||||
heygem_dir = [
|
||||
node.get("inputs")
|
||||
for node in workflow.values()
|
||||
if node.get("class_type") == "HeyGemF2F" or node.get("class_type") == "HeyGemF2FFromFile"
|
||||
][0]["heygem_temp_path"]
|
||||
# returns the image as bytes
|
||||
file_list = os.listdir(heygem_dir)
|
||||
# 获取按照文件时间创建排序的列表,默认是按时间升序
|
||||
new_file_list = sorted(file_list, key=lambda file: os.path.getctime(os.path.join(heygem_dir, file)),
|
||||
reverse=True)
|
||||
if len(new_file_list) > 0:
|
||||
try:
|
||||
shutil.copy(os.path.join(output_dir, f), os.path.join(output_dir.replace("output", "output_s3"), f))
|
||||
shutil.copy(os.path.join(heygem_dir, new_file_list[0]), os.path.join(output_dir.replace("output", "output_s3"), new_file_list[0]))
|
||||
except:
|
||||
try:
|
||||
print("Try move file to S3 manually")
|
||||
# S3 Fallback
|
||||
import boto3
|
||||
import yaml
|
||||
with open("/root/comfy/ComfyUI/custom_nodes/ComfyUI-CustomNode/config.yaml", encoding="utf-8",mode="r+") as config:
|
||||
with open("/root/comfy/ComfyUI/custom_nodes/ComfyUI-CustomNode/config.yaml", encoding="utf-8",
|
||||
mode="r+") as config:
|
||||
yaml_config = yaml.load(config, Loader=yaml.FullLoader)
|
||||
awss3 = boto3.resource('s3', aws_access_key_id=yaml_config["aws_key_id"],
|
||||
aws_secret_access_key=yaml_config["aws_access_key"])
|
||||
awss3.meta.client.upload_file(os.path.join(output_dir, f), bucket_output, f)
|
||||
aws_secret_access_key=yaml_config["aws_access_key"])
|
||||
awss3.meta.client.upload_file(os.path.join(heygem_dir, new_file_list[0]), bucket_output, new_file_list[0])
|
||||
except:
|
||||
raise Exception("Failed to move file to S3 manually")
|
||||
return f
|
||||
raise Exception("Failed to move HeyGem file to S3 manually")
|
||||
return new_file_list[0]
|
||||
else:
|
||||
raise FileNotFoundError("HeyGem generation file not found")
|
||||
else:
|
||||
raise Exception("Workflow does not contain VHS_VideoCombine/HeygemF2F node, cannot find output file")
|
||||
|
||||
|
||||
|
||||
|
||||
@modal.fastapi_endpoint(method="POST")
|
||||
def api(self, item: Dict, token: HTTPAuthorizationCredentials = Depends(auth_scheme)):
|
||||
|
||||
Reference in New Issue
Block a user