本文档介绍了 Stable Diffusion Web UI 中的进度和状态跟踪系统,该系统可在图像生成过程中提供视觉反馈。这包括进度条、剩余时间估算、实时预览和任务队列管理。
有关整体图像生成流程的信息,请参阅 图像生成流程。
进度跟踪系统分为服务器端和客户端组件,它们通过 API 端点进行通信。这种架构可在计算密集型操作期间实现实时更新,同时保持 UI 的响应能力。
来源:javascript/progressbar.js75-215 modules/progress.py87-141
来源:modules/progress.py16-20 javascript/progressbar.js75-215
WebUI 中的任务会经历不同的状态
这些状态在服务器的全局变量中进行跟踪
current_task:存储当前执行任务的 IDpending_tasks:等待处理的任务的有序字典finished_tasks:最近完成的任务列表来源:modules/progress.py16-20 modules/progress.py23-39
生成图像时,会在 JavaScript 中使用 randomId() 创建一个唯一的任务 ID,并将其传递给后端。此 ID 用于在任务的整个生命周期中跟踪该任务。
任务 ID 的格式为 task(TYPE-RANDOM),其中
TYPE 标识生成类型(txt2img、img2img 等)RANDOM 是一个唯一的字母数字字符串来源:javascript/ui.js150-166 javascript/progressbar.js68-70 modules/progress.py40-44
进度条 UI 由多个元素组成
生成过程中,提交按钮会隐藏,并被中断/跳过按钮取代。
来源:javascript/progressbar.js100-151 javascript/ui.js130-142
来源:javascript/progressbar.js75-215
服务器在 /internal/progress 处公开了一个内部 REST API 端点,该端点向客户端提供进度信息。此 API 是生成过程与 UI 之间的桥梁。
请求 (ProgressRequest)
{
"id_task": "task(txt2img-ABC1234)", // ID of the task to track
"id_live_preview": 42, // ID of last received preview
"live_preview": true // Whether to include preview
}
响应 (ProgressResponse)
{
"active": true, // Whether task is currently being processed
"queued": false, // Whether task is waiting in queue
"completed": false, // Whether task has completed
"progress": 0.45, // Progress from 0 to 1
"eta": 23.5, // Estimated time remaining in seconds
"live_preview": "data:...", // Base64 encoded preview image
"id_live_preview": 43, // ID of current preview image
"textinfo": "Sampling..." // Text info about the current state
}
来源:modules/progress.py55-73 modules/progress.py87-141
进度根据以下内容计算
job_no / job_count)sampling_step / sampling_steps)该公式将这两者结合起来,得到一个从 0 到 1 的总体进度值
progress = job_no / job_count + (1 / job_count) * (sampling_step / sampling_steps)
ETA 的估算方法是:
elapsed_time = current_time - start_time
predicted_duration = elapsed_time / progress
eta = predicted_duration - elapsed_time
实时预览功能显示正在生成的图像的当前状态,并实时更新。
当客户端请求带有 live_preview=true 的进度时
shared.state.current_image 捕获当前图像状态opts.live_previews_image_format 指定的格式(PNG 或 JPEG)进行编码实时预览根据图像大小进行优化,以平衡质量和性能。
来源:modules/progress.py116-140 javascript/progressbar.js178-207
WebUI 可以处理多个生成请求。当任务超出可用资源时,它们会被放入队列。
任务在三个集合中移动
pending_tasks:等待处理的任务(有序字典)current_task:当前活动的任务(单个任务 ID)finished_tasks:最近完成的任务(列表,限制为 16 项)来源:modules/progress.py16-20 modules/progress.py23-39
对于排队的任务,进度条显示队列位置
"In queue: X/Y"
其中 X 是任务在队列中的位置,Y 是队列的总大小。
此信息有助于用户了解其任务何时开始处理。
进度跟踪系统通过 JavaScript 函数与基于 Gradio 的 UI 集成,这些函数根据生成状态显示/隐藏 UI 元素。
UI 为提交按钮区域提供三种状态
这些状态在生成过程中提供了视觉反馈和控件选项。
WebUI 将活动任务 ID 存储在浏览器 localStorage 中,从而可以在页面重新加载或崩溃后恢复进度跟踪。这是通过以下方式实现的:
localSet("txt2img_task_id", id)restoreProgressTxt2img()” 和 “restoreProgressImg2img()”进度跟踪系统与键盘快捷键系统集成,以便在生成过程中提供控件
这些快捷键通过提供对生成控件的快速访问来改善用户体验。
来源: script.js143-191
为了防止在长时间生成过程中设备屏幕关闭,系统可以请求唤醒锁
这由 opts.prevent_screen_sleep_during_generation 设置控制。
来源: javascript/progressbar.js81-98
生成结束后,系统会收集并显示性能统计信息
这些信息有助于用户了解资源使用情况并优化工作流程。