包含: - hair_service_sd: 换发型/换发色算法服务 (端口 8801) - photo_service: LoRA 训练调度服务 (端口 32678) - stable-diffusion-webui: SD WebUI 推理服务 (端口 57860) - kohya_ss_home: 训练环境代码 - meidaojia: 监控测试脚本 - setup.sh: 一键部署脚本 (conda环境恢复 + 配置生成 + 完整性检查) - start_all_services.sh: 启动3个服务 - configure.ini.template: 路径模板化 (BASE_DIR自动推导) - conda_envs/py310.yml: py310 环境定义 大文件 (weights/, models/, data/, conda_envs/*.tar.gz 等) 通过 .gitignore 排除, 由网盘单独上传。
65 lines
1.7 KiB
Python
Executable File
65 lines
1.7 KiB
Python
Executable File
from collections import defaultdict
|
|
|
|
|
|
def patch(key, obj, field, replacement):
|
|
"""Replaces a function in a module or a class.
|
|
|
|
Also stores the original function in this module, possible to be retrieved via original(key, obj, field).
|
|
If the function is already replaced by this caller (key), an exception is raised -- use undo() before that.
|
|
|
|
Arguments:
|
|
key: identifying information for who is doing the replacement. You can use __name__.
|
|
obj: the module or the class
|
|
field: name of the function as a string
|
|
replacement: the new function
|
|
|
|
Returns:
|
|
the original function
|
|
"""
|
|
|
|
patch_key = (obj, field)
|
|
if patch_key in originals[key]:
|
|
raise RuntimeError(f"patch for {field} is already applied")
|
|
|
|
original_func = getattr(obj, field)
|
|
originals[key][patch_key] = original_func
|
|
|
|
setattr(obj, field, replacement)
|
|
|
|
return original_func
|
|
|
|
|
|
def undo(key, obj, field):
|
|
"""Undoes the peplacement by the patch().
|
|
|
|
If the function is not replaced, raises an exception.
|
|
|
|
Arguments:
|
|
key: identifying information for who is doing the replacement. You can use __name__.
|
|
obj: the module or the class
|
|
field: name of the function as a string
|
|
|
|
Returns:
|
|
Always None
|
|
"""
|
|
|
|
patch_key = (obj, field)
|
|
|
|
if patch_key not in originals[key]:
|
|
raise RuntimeError(f"there is no patch for {field} to undo")
|
|
|
|
original_func = originals[key].pop(patch_key)
|
|
setattr(obj, field, original_func)
|
|
|
|
return None
|
|
|
|
|
|
def original(key, obj, field):
|
|
"""Returns the original function for the patch created by the patch() function"""
|
|
patch_key = (obj, field)
|
|
|
|
return originals[key].get(patch_key, None)
|
|
|
|
|
|
originals = defaultdict(dict)
|