GLM-Image WebUI多用户协作方案共享服务独立输出目录配置教程1. 引言当团队都想用AI画图时你遇到了什么想象一下这个场景你们团队最近接了个大项目需要批量生成一批电商产品图。设计师小张用GLM-Image画了几张效果不错产品经理小李看到了也想试试运营小王听说后也凑过来想生成些社交媒体素材。结果呢三个人围着一台服务器你等我、我等你。小张生成的猫咪产品图和小李要的科技感背景混在一起找起来费劲不说还经常不小心把别人的图覆盖了。更头疼的是每次有人想用都得重新启动服务或者等别人用完。如果你正在经历这种“AI绘画抢凳子游戏”那么今天这个教程就是为你准备的。我将手把手教你如何搭建一个GLM-Image WebUI的多用户协作环境——一个共享的后端服务但每个用户都有自己独立的输出目录。简单说就是服务只启动一次大家都能用你画你的猫我画我的狗互不干扰所有生成结果自动分类保存找图再也不用翻遍整个文件夹。2. 为什么需要多用户协作配置2.1 单用户模式的痛点在标准的GLM-Image WebUI部署中通常是这样工作的一个服务进程运行在某个端口比如7860所有用户都访问同一个地址所有生成的图片都保存到同一个outputs目录文件名虽然有时间戳但混在一起很难管理这种模式在小规模个人使用时没问题但一旦多人参与问题就来了文件管理混乱张三的电商图、李四的艺术创作、王五的测试图片全混在一起权限问题如果开放写权限可能误删他人文件如果限制权限又影响使用资源冲突多人同时生成大尺寸图片时可能显存不足缺乏隔离无法按项目、按用户、按任务分类管理生成结果2.2 我们的解决方案共享服务独立目录我们要实现的目标很明确服务层面共享只启动一个GLM-Image模型服务节省显存和内存会话层面隔离每个用户或每个项目有独立的输出目录配置层面灵活可以动态指定输出路径无需修改代码管理层面清晰所有生成结果按预设结构自动整理下面这张图展示了我们的架构思路共享的GLM-Image服务 (端口:7860) ├── 用户A会话 → 输出到 /outputs/user_a/ ├── 用户B会话 → 输出到 /outputs/user_b/ ├── 项目X会话 → 输出到 /outputs/project_x/ └── 默认会话 → 输出到 /outputs/default/3. 环境准备与基础部署3.1 检查现有环境首先确保你的GLM-Image WebUI已经可以正常运行。如果你还没部署可以参考项目README快速搭建。打开终端检查服务状态# 查看GLM-Image服务是否在运行 ps aux | grep webui.py # 如果服务未运行按原方式启动 cd /root/build bash start.sh服务正常启动后你应该能在浏览器中访问http://你的服务器IP:7860并看到GLM-Image的Web界面。3.2 理解现有目录结构在开始修改前我们先看看默认的目录结构/root/build/ ├── webui.py # WebUI主程序 ├── start.sh # 启动脚本 ├── outputs/ # 默认输出目录 │ ├── 20250118_143022_123456.png │ ├── 20250118_143125_654321.png │ └── ... ├── cache/ # 缓存目录 └── requirements.txt # 依赖文件现在的outputs目录是所有生成图片的存放地我们需要改造它让它支持按用户/项目分目录存储。4. 核心改造让WebUI支持动态输出目录4.1 修改WebUI主程序GLM-Image WebUI基于Gradio构建我们需要修改图片保存的逻辑。打开/root/build/webui.py文件找到图片生成和保存的相关代码。关键修改点1添加输出目录参数在文件开头附近找到参数定义部分添加一个输出目录参数import os import gradio as gr from datetime import datetime import argparse # 添加命令行参数解析 parser argparse.ArgumentParser() parser.add_argument(--output-base, typestr, default/root/build/outputs, help基础输出目录用户目录会创建在此目录下) parser.add_argument(--default-user, typestr, defaultdefault, help默认用户/项目名称) args, _ parser.parse_known_args() # 确保基础目录存在 os.makedirs(args.output_base, exist_okTrue)关键修改点2改造图片保存函数找到保存生成图片的函数通常叫save_image或类似名称修改为支持用户目录def save_image_with_user_dir(image, user_dirdefault): 将图片保存到指定用户目录 Args: image: PIL Image对象 user_dir: 用户/项目目录名 Returns: str: 保存的文件路径 # 创建用户专属目录 user_output_dir os.path.join(args.output_base, user_dir) os.makedirs(user_output_dir, exist_okTrue) # 生成带时间戳的文件名 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) seed random # 这里可以从参数获取实际种子值 filename f{timestamp}_{seed}.png filepath os.path.join(user_output_dir, filename) # 保存图片 image.save(filepath) print(f图片已保存到: {filepath}) return filepath关键修改点3修改Gradio界面添加用户目录选择在创建Gradio界面的部分添加一个用户目录输入框# 在原有界面组件中添加 with gr.Row(): user_dir_input gr.Textbox( label用户/项目目录, valueargs.default_user, placeholder输入用户名称或项目标识, info生成图片将保存到该目录下 ) # 修改生成按钮的回调函数 def generate_image(prompt, negative_prompt, width, height, steps, guidance_scale, seed, user_dir): # ... 原有的生成逻辑 ... # 生成图片 image generate_with_glm(prompt, negative_prompt, width, height, steps, guidance_scale, seed) # 保存到用户目录 saved_path save_image_with_user_dir(image, user_dir) return image, f生成完成图片保存到: {saved_path}4.2 创建目录管理脚本为了方便管理用户目录我们创建一个简单的管理脚本manage_dirs.py#!/usr/bin/env python3 GLM-Image用户目录管理工具 import os import argparse from pathlib import Path def list_users(base_dir): 列出所有用户目录 base_path Path(base_dir) if not base_path.exists(): print(f基础目录不存在: {base_dir}) return print(f\n用户目录列表 ({base_dir}):) print(- * 50) dirs [d for d in base_path.iterdir() if d.is_dir()] if not dirs: print(暂无用户目录) return for i, dir_path in enumerate(sorted(dirs), 1): # 统计目录中的图片数量 image_count len(list(dir_path.glob(*.png))) len(list(dir_path.glob(*.jpg))) size_mb sum(f.stat().st_size for f in dir_path.rglob(*) if f.is_file()) / (1024*1024) print(f{i:2d}. {dir_path.name:20s} | 图片: {image_count:3d} | 大小: {size_mb:6.1f} MB) def create_user(base_dir, user_name): 创建新用户目录 user_dir Path(base_dir) / user_name user_dir.mkdir(parentsTrue, exist_okTrue) print(f✓ 已创建用户目录: {user_dir}) def cleanup_empty(base_dir): 清理空目录 base_path Path(base_dir) removed 0 for dir_path in base_path.iterdir(): if dir_path.is_dir(): # 检查是否为空 if not any(dir_path.iterdir()): dir_path.rmdir() print(f✓ 已删除空目录: {dir_path.name}) removed 1 print(f\n清理完成共删除 {removed} 个空目录) if __name__ __main__: parser argparse.ArgumentParser(descriptionGLM-Image用户目录管理) parser.add_argument(--base-dir, default/root/build/outputs, help基础输出目录) subparsers parser.add_subparsers(destcommand, help命令) # list命令 list_parser subparsers.add_parser(list, help列出所有用户目录) # create命令 create_parser subparsers.add_parser(create, help创建新用户目录) create_parser.add_argument(user_name, help用户/项目名称) # cleanup命令 cleanup_parser subparsers.add_parser(cleanup, help清理空目录) args parser.parse_args() if args.command list: list_users(args.base_dir) elif args.command create: create_user(args.base_dir, args.user_name) elif args.command cleanup: cleanup_empty(args.base_dir) else: parser.print_help()给脚本添加执行权限chmod x /root/build/manage_dirs.py使用示例# 列出所有用户目录 python manage_dirs.py list # 创建新用户目录 python manage_dirs.py create design_team # 清理空目录 python manage_dirs.py cleanup5. 启动与配置多用户服务5.1 修改启动脚本编辑/root/build/start.sh添加对新参数的支持#!/bin/bash # 默认值 PORT7860 OUTPUT_BASE/root/build/outputs DEFAULT_USERdefault SHAREfalse # 解析参数 while [[ $# -gt 0 ]]; do case $1 in --port) PORT$2 shift 2 ;; --output-base) OUTPUT_BASE$2 shift 2 ;; --default-user) DEFAULT_USER$2 shift 2 ;; --share) SHAREtrue shift ;; --help|-h) echo 用法: $0 [选项] echo 选项: echo --port PORT 指定服务端口 (默认: 7860) echo --output-base DIR 指定基础输出目录 (默认: /root/build/outputs) echo --default-user NAME 默认用户目录名 (默认: default) echo --share 启用Gradio公共分享链接 echo --help, -h 显示帮助信息 exit 0 ;; *) echo 未知选项: $1 exit 1 ;; esac done # 创建输出目录 mkdir -p $OUTPUT_BASE echo 启动 GLM-Image WebUI... echo 端口: $PORT echo 输出目录: $OUTPUT_BASE echo 默认用户: $DEFAULT_USER # 设置环境变量 export HF_HOME/root/build/cache/huggingface export HUGGINGFACE_HUB_CACHE/root/build/cache/huggingface/hub export TORCH_HOME/root/build/cache/torch export HF_ENDPOINThttps://hf-mirror.com # 启动WebUI python webui.py \ --port $PORT \ --output-base $OUTPUT_BASE \ --default-user $DEFAULT_USER \ $( [ $SHARE true ] echo --share )5.2 启动多用户服务现在可以用新的方式启动服务了# 基本启动使用默认设置 bash start.sh # 指定输出目录和默认用户 bash start.sh --output-base /data/glm_outputs --default-user team_project # 指定端口并启用分享 bash start.sh --port 8080 --share --default-user design_department5.3 验证服务运行启动后访问WebUI界面你应该能看到新增的用户/项目目录输入框http://你的服务器IP:7860在界面中在用户/项目目录框中输入你的标识如zhangsan、project_a等填写提示词和参数点击生成图片会自动保存到/root/build/outputs/你输入的目录/下6. 实际使用场景示例6.1 团队协作场景假设你们团队有三个成员在使用GLM-Image配置方式# 启动服务时设置默认目录 bash start.sh --default-user team_default # 团队成员使用不同的目录标识 # 张三访问时输入: zhangsan # 李四访问时输入: lisi # 王五访问时输入: wangwu生成的目录结构/root/build/outputs/ ├── team_default/ # 默认目录临时测试用 ├── zhangsan/ # 张三的所有生成结果 │ ├── 20250118_143022_123456.png │ ├── 20250118_150011_654321.png │ └── ... ├── lisi/ # 李四的所有生成结果 │ ├── 20250118_144530_789012.png │ └── ... └── wangwu/ # 王五的所有生成结果 └── ...6.2 项目管理场景如果你有多个项目同时进行# 为不同项目启动不同实例如果需要 # 项目A bash start.sh --port 7860 --default-user project_ecommerce # 项目B bash start.sh --port 7861 --default-user project_marketing # 项目C bash start.sh --port 7862 --default-user project_art或者在同一个服务中管理用户输入project_ecommerce → 保存到 outputs/project_ecommerce/ 用户输入project_marketing → 保存到 outputs/project_marketing/ 用户输入project_art → 保存到 outputs/project_art/6.3 批量生成场景如果你需要批量生成大量图片可以结合脚本使用# batch_generate.py import requests import json import time def batch_generate(api_url, prompts, user_dirbatch_job): 批量生成图片 results [] for i, prompt in enumerate(prompts): print(f生成第 {i1}/{len(prompts)} 张: {prompt[:50]}...) # 构造请求数据根据实际API调整 data { prompt: prompt, user_dir: user_dir, width: 1024, height: 1024, steps: 50, guidance_scale: 7.5 } # 发送请求 response requests.post(api_url, jsondata) if response.status_code 200: result response.json() results.append({ prompt: prompt, image_path: result.get(image_path), success: True }) else: results.append({ prompt: prompt, error: response.text, success: False }) # 避免请求过快 time.sleep(2) return results # 使用示例 prompts [ a beautiful sunset over mountains, digital art, cyberpunk city street at night, neon lights, cute cat playing with yarn, cartoon style ] results batch_generate( api_urlhttp://localhost:7860/api/generate, promptsprompts, user_dirbatch_20250118 )7. 高级配置与优化建议7.1 添加用户认证可选如果需要在企业环境中使用可以添加简单的HTTP基础认证# 在webui.py中添加 import base64 from functools import wraps # 简单的用户认证装饰器 def require_auth(f): wraps(f) def decorated(*args, **kwargs): auth request.headers.get(Authorization) if not auth: return 未授权, 401 # 简单的用户名密码验证 # 实际使用中应该用更安全的方式 if auth Basic base64.b64encode(buser:password).decode(): return f(*args, **kwargs) else: return 认证失败, 401 return decorated # 应用到生成接口 app.route(/api/generate, methods[POST]) require_auth def api_generate(): # ... 生成逻辑 ...7.2 添加磁盘空间监控为了避免输出目录占满磁盘可以添加监控# disk_monitor.py import os import shutil import schedule import time def check_disk_usage(path, threshold_gb100): 检查目录磁盘使用情况 total_size 0 for dirpath, dirnames, filenames in os.walk(path): for f in filenames: fp os.path.join(dirpath, f) total_size os.path.getsize(fp) total_gb total_size / (1024**3) if total_gb threshold_gb: print(f警告: {path} 目录已使用 {total_gb:.1f}GB超过阈值 {threshold_gb}GB) # 可以添加自动清理旧文件的逻辑 return False return True def cleanup_old_files(dir_path, days30): 清理指定天数前的文件 now time.time() cutoff now - (days * 24 * 60 * 60) removed_count 0 removed_size 0 for dirpath, dirnames, filenames in os.walk(dir_path): for f in filenames: filepath os.path.join(dirpath, f) if os.path.getmtime(filepath) cutoff: file_size os.path.getsize(filepath) os.remove(filepath) removed_count 1 removed_size file_size if removed_count 0: print(f清理完成: 删除了 {removed_count} 个文件释放 {removed_size/(1024**2):.1f}MB 空间) return removed_count # 定时任务 schedule.every().day.at(02:00).do( cleanup_old_files, dir_path/root/build/outputs, days7 # 保留7天内的文件 ) if __name__ __main__: while True: schedule.run_pending() time.sleep(60)7.3 性能优化建议使用SSD存储生成大量图片时SSD的读写速度远快于HDD定期清理缓存GLM-Image的缓存文件可能很大定期清理cache目录监控显存使用多人同时使用时注意显存占用设置生成队列如果并发请求多可以考虑添加任务队列8. 常见问题与解决方案8.1 权限问题问题多个用户需要写入同一基础目录但权限设置复杂。解决方案# 设置输出目录为可写 chmod 777 /root/build/outputs # 或者更好的方式使用ACL设置特定用户组 sudo groupadd glm_users sudo usermod -a -G glm_users user1 sudo usermod -a -G glm_users user2 sudo chgrp -R glm_users /root/build/outputs sudo chmod -R 775 /root/build/outputs8.2 目录不存在错误问题用户输入了无效的目录名导致保存失败。解决方案在保存函数中添加验证和自动创建def validate_and_create_dir(user_dir): 验证并创建用户目录 # 移除非法字符 import re safe_dir re.sub(r[^\w\-_], , user_dir) if not safe_dir: safe_dir default user_path os.path.join(args.output_base, safe_dir) os.makedirs(user_path, exist_okTrue) return safe_dir, user_path8.3 磁盘空间不足问题生成大量图片后磁盘空间不足。解决方案定期清理旧文件如保留最近30天的压缩历史图片使用外部存储或网络存储# 查找并删除30天前的文件 find /root/build/outputs -name *.png -type f -mtime 30 -delete # 或者移动到归档目录 find /root/build/outputs -name *.png -type f -mtime 30 -exec mv {} /archive/ \;8.4 服务稳定性问题长时间运行后服务可能不稳定。解决方案使用进程监控工具如supervisor定期重启服务添加健康检查接口# 添加健康检查端点 app.route(/health) def health_check(): return {status: healthy, timestamp: time.time()}9. 总结通过本文的配置我们成功将单用户GLM-Image WebUI改造成了支持多用户协作的系统。主要实现了服务共享一个GLM-Image服务进程供多人使用节省资源目录隔离每个用户/项目有独立的输出目录文件管理清晰灵活配置支持动态指定输出路径无需修改代码重启服务易于管理提供目录管理工具方便查看和清理这种架构特别适合小型团队协作使用AI绘画工具个人管理多个项目需要批量生成并分类保存的场景企业内部分享AI能力实际使用建议对于小团队3-5人直接使用本文方案即可对于更大规模使用可以考虑添加用户认证和权限管理定期监控磁盘使用情况避免空间不足重要生成结果建议定期备份改造后的系统不仅解决了文件混乱的问题还为后续的功能扩展打下了基础。你可以基于这个框架继续添加用户配额管理、生成统计、质量评估等功能打造更适合自己团队需求的AI绘画协作平台。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
GLM-Image WebUI多用户协作方案:共享服务+独立输出目录配置教程
GLM-Image WebUI多用户协作方案共享服务独立输出目录配置教程1. 引言当团队都想用AI画图时你遇到了什么想象一下这个场景你们团队最近接了个大项目需要批量生成一批电商产品图。设计师小张用GLM-Image画了几张效果不错产品经理小李看到了也想试试运营小王听说后也凑过来想生成些社交媒体素材。结果呢三个人围着一台服务器你等我、我等你。小张生成的猫咪产品图和小李要的科技感背景混在一起找起来费劲不说还经常不小心把别人的图覆盖了。更头疼的是每次有人想用都得重新启动服务或者等别人用完。如果你正在经历这种“AI绘画抢凳子游戏”那么今天这个教程就是为你准备的。我将手把手教你如何搭建一个GLM-Image WebUI的多用户协作环境——一个共享的后端服务但每个用户都有自己独立的输出目录。简单说就是服务只启动一次大家都能用你画你的猫我画我的狗互不干扰所有生成结果自动分类保存找图再也不用翻遍整个文件夹。2. 为什么需要多用户协作配置2.1 单用户模式的痛点在标准的GLM-Image WebUI部署中通常是这样工作的一个服务进程运行在某个端口比如7860所有用户都访问同一个地址所有生成的图片都保存到同一个outputs目录文件名虽然有时间戳但混在一起很难管理这种模式在小规模个人使用时没问题但一旦多人参与问题就来了文件管理混乱张三的电商图、李四的艺术创作、王五的测试图片全混在一起权限问题如果开放写权限可能误删他人文件如果限制权限又影响使用资源冲突多人同时生成大尺寸图片时可能显存不足缺乏隔离无法按项目、按用户、按任务分类管理生成结果2.2 我们的解决方案共享服务独立目录我们要实现的目标很明确服务层面共享只启动一个GLM-Image模型服务节省显存和内存会话层面隔离每个用户或每个项目有独立的输出目录配置层面灵活可以动态指定输出路径无需修改代码管理层面清晰所有生成结果按预设结构自动整理下面这张图展示了我们的架构思路共享的GLM-Image服务 (端口:7860) ├── 用户A会话 → 输出到 /outputs/user_a/ ├── 用户B会话 → 输出到 /outputs/user_b/ ├── 项目X会话 → 输出到 /outputs/project_x/ └── 默认会话 → 输出到 /outputs/default/3. 环境准备与基础部署3.1 检查现有环境首先确保你的GLM-Image WebUI已经可以正常运行。如果你还没部署可以参考项目README快速搭建。打开终端检查服务状态# 查看GLM-Image服务是否在运行 ps aux | grep webui.py # 如果服务未运行按原方式启动 cd /root/build bash start.sh服务正常启动后你应该能在浏览器中访问http://你的服务器IP:7860并看到GLM-Image的Web界面。3.2 理解现有目录结构在开始修改前我们先看看默认的目录结构/root/build/ ├── webui.py # WebUI主程序 ├── start.sh # 启动脚本 ├── outputs/ # 默认输出目录 │ ├── 20250118_143022_123456.png │ ├── 20250118_143125_654321.png │ └── ... ├── cache/ # 缓存目录 └── requirements.txt # 依赖文件现在的outputs目录是所有生成图片的存放地我们需要改造它让它支持按用户/项目分目录存储。4. 核心改造让WebUI支持动态输出目录4.1 修改WebUI主程序GLM-Image WebUI基于Gradio构建我们需要修改图片保存的逻辑。打开/root/build/webui.py文件找到图片生成和保存的相关代码。关键修改点1添加输出目录参数在文件开头附近找到参数定义部分添加一个输出目录参数import os import gradio as gr from datetime import datetime import argparse # 添加命令行参数解析 parser argparse.ArgumentParser() parser.add_argument(--output-base, typestr, default/root/build/outputs, help基础输出目录用户目录会创建在此目录下) parser.add_argument(--default-user, typestr, defaultdefault, help默认用户/项目名称) args, _ parser.parse_known_args() # 确保基础目录存在 os.makedirs(args.output_base, exist_okTrue)关键修改点2改造图片保存函数找到保存生成图片的函数通常叫save_image或类似名称修改为支持用户目录def save_image_with_user_dir(image, user_dirdefault): 将图片保存到指定用户目录 Args: image: PIL Image对象 user_dir: 用户/项目目录名 Returns: str: 保存的文件路径 # 创建用户专属目录 user_output_dir os.path.join(args.output_base, user_dir) os.makedirs(user_output_dir, exist_okTrue) # 生成带时间戳的文件名 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) seed random # 这里可以从参数获取实际种子值 filename f{timestamp}_{seed}.png filepath os.path.join(user_output_dir, filename) # 保存图片 image.save(filepath) print(f图片已保存到: {filepath}) return filepath关键修改点3修改Gradio界面添加用户目录选择在创建Gradio界面的部分添加一个用户目录输入框# 在原有界面组件中添加 with gr.Row(): user_dir_input gr.Textbox( label用户/项目目录, valueargs.default_user, placeholder输入用户名称或项目标识, info生成图片将保存到该目录下 ) # 修改生成按钮的回调函数 def generate_image(prompt, negative_prompt, width, height, steps, guidance_scale, seed, user_dir): # ... 原有的生成逻辑 ... # 生成图片 image generate_with_glm(prompt, negative_prompt, width, height, steps, guidance_scale, seed) # 保存到用户目录 saved_path save_image_with_user_dir(image, user_dir) return image, f生成完成图片保存到: {saved_path}4.2 创建目录管理脚本为了方便管理用户目录我们创建一个简单的管理脚本manage_dirs.py#!/usr/bin/env python3 GLM-Image用户目录管理工具 import os import argparse from pathlib import Path def list_users(base_dir): 列出所有用户目录 base_path Path(base_dir) if not base_path.exists(): print(f基础目录不存在: {base_dir}) return print(f\n用户目录列表 ({base_dir}):) print(- * 50) dirs [d for d in base_path.iterdir() if d.is_dir()] if not dirs: print(暂无用户目录) return for i, dir_path in enumerate(sorted(dirs), 1): # 统计目录中的图片数量 image_count len(list(dir_path.glob(*.png))) len(list(dir_path.glob(*.jpg))) size_mb sum(f.stat().st_size for f in dir_path.rglob(*) if f.is_file()) / (1024*1024) print(f{i:2d}. {dir_path.name:20s} | 图片: {image_count:3d} | 大小: {size_mb:6.1f} MB) def create_user(base_dir, user_name): 创建新用户目录 user_dir Path(base_dir) / user_name user_dir.mkdir(parentsTrue, exist_okTrue) print(f✓ 已创建用户目录: {user_dir}) def cleanup_empty(base_dir): 清理空目录 base_path Path(base_dir) removed 0 for dir_path in base_path.iterdir(): if dir_path.is_dir(): # 检查是否为空 if not any(dir_path.iterdir()): dir_path.rmdir() print(f✓ 已删除空目录: {dir_path.name}) removed 1 print(f\n清理完成共删除 {removed} 个空目录) if __name__ __main__: parser argparse.ArgumentParser(descriptionGLM-Image用户目录管理) parser.add_argument(--base-dir, default/root/build/outputs, help基础输出目录) subparsers parser.add_subparsers(destcommand, help命令) # list命令 list_parser subparsers.add_parser(list, help列出所有用户目录) # create命令 create_parser subparsers.add_parser(create, help创建新用户目录) create_parser.add_argument(user_name, help用户/项目名称) # cleanup命令 cleanup_parser subparsers.add_parser(cleanup, help清理空目录) args parser.parse_args() if args.command list: list_users(args.base_dir) elif args.command create: create_user(args.base_dir, args.user_name) elif args.command cleanup: cleanup_empty(args.base_dir) else: parser.print_help()给脚本添加执行权限chmod x /root/build/manage_dirs.py使用示例# 列出所有用户目录 python manage_dirs.py list # 创建新用户目录 python manage_dirs.py create design_team # 清理空目录 python manage_dirs.py cleanup5. 启动与配置多用户服务5.1 修改启动脚本编辑/root/build/start.sh添加对新参数的支持#!/bin/bash # 默认值 PORT7860 OUTPUT_BASE/root/build/outputs DEFAULT_USERdefault SHAREfalse # 解析参数 while [[ $# -gt 0 ]]; do case $1 in --port) PORT$2 shift 2 ;; --output-base) OUTPUT_BASE$2 shift 2 ;; --default-user) DEFAULT_USER$2 shift 2 ;; --share) SHAREtrue shift ;; --help|-h) echo 用法: $0 [选项] echo 选项: echo --port PORT 指定服务端口 (默认: 7860) echo --output-base DIR 指定基础输出目录 (默认: /root/build/outputs) echo --default-user NAME 默认用户目录名 (默认: default) echo --share 启用Gradio公共分享链接 echo --help, -h 显示帮助信息 exit 0 ;; *) echo 未知选项: $1 exit 1 ;; esac done # 创建输出目录 mkdir -p $OUTPUT_BASE echo 启动 GLM-Image WebUI... echo 端口: $PORT echo 输出目录: $OUTPUT_BASE echo 默认用户: $DEFAULT_USER # 设置环境变量 export HF_HOME/root/build/cache/huggingface export HUGGINGFACE_HUB_CACHE/root/build/cache/huggingface/hub export TORCH_HOME/root/build/cache/torch export HF_ENDPOINThttps://hf-mirror.com # 启动WebUI python webui.py \ --port $PORT \ --output-base $OUTPUT_BASE \ --default-user $DEFAULT_USER \ $( [ $SHARE true ] echo --share )5.2 启动多用户服务现在可以用新的方式启动服务了# 基本启动使用默认设置 bash start.sh # 指定输出目录和默认用户 bash start.sh --output-base /data/glm_outputs --default-user team_project # 指定端口并启用分享 bash start.sh --port 8080 --share --default-user design_department5.3 验证服务运行启动后访问WebUI界面你应该能看到新增的用户/项目目录输入框http://你的服务器IP:7860在界面中在用户/项目目录框中输入你的标识如zhangsan、project_a等填写提示词和参数点击生成图片会自动保存到/root/build/outputs/你输入的目录/下6. 实际使用场景示例6.1 团队协作场景假设你们团队有三个成员在使用GLM-Image配置方式# 启动服务时设置默认目录 bash start.sh --default-user team_default # 团队成员使用不同的目录标识 # 张三访问时输入: zhangsan # 李四访问时输入: lisi # 王五访问时输入: wangwu生成的目录结构/root/build/outputs/ ├── team_default/ # 默认目录临时测试用 ├── zhangsan/ # 张三的所有生成结果 │ ├── 20250118_143022_123456.png │ ├── 20250118_150011_654321.png │ └── ... ├── lisi/ # 李四的所有生成结果 │ ├── 20250118_144530_789012.png │ └── ... └── wangwu/ # 王五的所有生成结果 └── ...6.2 项目管理场景如果你有多个项目同时进行# 为不同项目启动不同实例如果需要 # 项目A bash start.sh --port 7860 --default-user project_ecommerce # 项目B bash start.sh --port 7861 --default-user project_marketing # 项目C bash start.sh --port 7862 --default-user project_art或者在同一个服务中管理用户输入project_ecommerce → 保存到 outputs/project_ecommerce/ 用户输入project_marketing → 保存到 outputs/project_marketing/ 用户输入project_art → 保存到 outputs/project_art/6.3 批量生成场景如果你需要批量生成大量图片可以结合脚本使用# batch_generate.py import requests import json import time def batch_generate(api_url, prompts, user_dirbatch_job): 批量生成图片 results [] for i, prompt in enumerate(prompts): print(f生成第 {i1}/{len(prompts)} 张: {prompt[:50]}...) # 构造请求数据根据实际API调整 data { prompt: prompt, user_dir: user_dir, width: 1024, height: 1024, steps: 50, guidance_scale: 7.5 } # 发送请求 response requests.post(api_url, jsondata) if response.status_code 200: result response.json() results.append({ prompt: prompt, image_path: result.get(image_path), success: True }) else: results.append({ prompt: prompt, error: response.text, success: False }) # 避免请求过快 time.sleep(2) return results # 使用示例 prompts [ a beautiful sunset over mountains, digital art, cyberpunk city street at night, neon lights, cute cat playing with yarn, cartoon style ] results batch_generate( api_urlhttp://localhost:7860/api/generate, promptsprompts, user_dirbatch_20250118 )7. 高级配置与优化建议7.1 添加用户认证可选如果需要在企业环境中使用可以添加简单的HTTP基础认证# 在webui.py中添加 import base64 from functools import wraps # 简单的用户认证装饰器 def require_auth(f): wraps(f) def decorated(*args, **kwargs): auth request.headers.get(Authorization) if not auth: return 未授权, 401 # 简单的用户名密码验证 # 实际使用中应该用更安全的方式 if auth Basic base64.b64encode(buser:password).decode(): return f(*args, **kwargs) else: return 认证失败, 401 return decorated # 应用到生成接口 app.route(/api/generate, methods[POST]) require_auth def api_generate(): # ... 生成逻辑 ...7.2 添加磁盘空间监控为了避免输出目录占满磁盘可以添加监控# disk_monitor.py import os import shutil import schedule import time def check_disk_usage(path, threshold_gb100): 检查目录磁盘使用情况 total_size 0 for dirpath, dirnames, filenames in os.walk(path): for f in filenames: fp os.path.join(dirpath, f) total_size os.path.getsize(fp) total_gb total_size / (1024**3) if total_gb threshold_gb: print(f警告: {path} 目录已使用 {total_gb:.1f}GB超过阈值 {threshold_gb}GB) # 可以添加自动清理旧文件的逻辑 return False return True def cleanup_old_files(dir_path, days30): 清理指定天数前的文件 now time.time() cutoff now - (days * 24 * 60 * 60) removed_count 0 removed_size 0 for dirpath, dirnames, filenames in os.walk(dir_path): for f in filenames: filepath os.path.join(dirpath, f) if os.path.getmtime(filepath) cutoff: file_size os.path.getsize(filepath) os.remove(filepath) removed_count 1 removed_size file_size if removed_count 0: print(f清理完成: 删除了 {removed_count} 个文件释放 {removed_size/(1024**2):.1f}MB 空间) return removed_count # 定时任务 schedule.every().day.at(02:00).do( cleanup_old_files, dir_path/root/build/outputs, days7 # 保留7天内的文件 ) if __name__ __main__: while True: schedule.run_pending() time.sleep(60)7.3 性能优化建议使用SSD存储生成大量图片时SSD的读写速度远快于HDD定期清理缓存GLM-Image的缓存文件可能很大定期清理cache目录监控显存使用多人同时使用时注意显存占用设置生成队列如果并发请求多可以考虑添加任务队列8. 常见问题与解决方案8.1 权限问题问题多个用户需要写入同一基础目录但权限设置复杂。解决方案# 设置输出目录为可写 chmod 777 /root/build/outputs # 或者更好的方式使用ACL设置特定用户组 sudo groupadd glm_users sudo usermod -a -G glm_users user1 sudo usermod -a -G glm_users user2 sudo chgrp -R glm_users /root/build/outputs sudo chmod -R 775 /root/build/outputs8.2 目录不存在错误问题用户输入了无效的目录名导致保存失败。解决方案在保存函数中添加验证和自动创建def validate_and_create_dir(user_dir): 验证并创建用户目录 # 移除非法字符 import re safe_dir re.sub(r[^\w\-_], , user_dir) if not safe_dir: safe_dir default user_path os.path.join(args.output_base, safe_dir) os.makedirs(user_path, exist_okTrue) return safe_dir, user_path8.3 磁盘空间不足问题生成大量图片后磁盘空间不足。解决方案定期清理旧文件如保留最近30天的压缩历史图片使用外部存储或网络存储# 查找并删除30天前的文件 find /root/build/outputs -name *.png -type f -mtime 30 -delete # 或者移动到归档目录 find /root/build/outputs -name *.png -type f -mtime 30 -exec mv {} /archive/ \;8.4 服务稳定性问题长时间运行后服务可能不稳定。解决方案使用进程监控工具如supervisor定期重启服务添加健康检查接口# 添加健康检查端点 app.route(/health) def health_check(): return {status: healthy, timestamp: time.time()}9. 总结通过本文的配置我们成功将单用户GLM-Image WebUI改造成了支持多用户协作的系统。主要实现了服务共享一个GLM-Image服务进程供多人使用节省资源目录隔离每个用户/项目有独立的输出目录文件管理清晰灵活配置支持动态指定输出路径无需修改代码重启服务易于管理提供目录管理工具方便查看和清理这种架构特别适合小型团队协作使用AI绘画工具个人管理多个项目需要批量生成并分类保存的场景企业内部分享AI能力实际使用建议对于小团队3-5人直接使用本文方案即可对于更大规模使用可以考虑添加用户认证和权限管理定期监控磁盘使用情况避免空间不足重要生成结果建议定期备份改造后的系统不仅解决了文件混乱的问题还为后续的功能扩展打下了基础。你可以基于这个框架继续添加用户配额管理、生成统计、质量评估等功能打造更适合自己团队需求的AI绘画协作平台。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。