"""Render the release editing comparisons, without investigation history.""" import json from pathlib import Path from scripts.model_card import original_url def render_audit(evaluation, platform): root = Path(evaluation) zh = platform == 'modelscope' def tr(en, cn): return cn if zh else en def picture(label, path): url = original_url(platform, path) return f'[![{label}]({url})]({url})' path = root/'editing/summary.json' if not path.exists(): return '' data = json.loads(path.read_text(encoding='utf-8')) lines = [tr('### 2048px image editing comparisons', '### 2048px 改图对比'), '', tr('Four paired editing examples are shown with their shared input, generated by BF16 in this evaluation. Outputs use 2048×2048, ' '40 steps, seed 42, CFG=1, KV cache and model CPU offload. Both precisions enable default ' 'VAE tiling (256px minimum tiles, 192px strides). The 1024px input PNGs are resized inside ' 'the pipeline with output_resolution=2048. All images link to the full original PNG.', '下列四组改图展示共同输入及成对输出;输入均为本次测评的 BF16 生成图。输出统一为 2048×2048、40 步、种子 42、CFG=1,' '启用 KV 缓存与按模型 CPU 卸载;两种精度均开启默认 VAE 分块(最小块 256px、步幅 192px)。' '流水线按 output_resolution=2048 处理 1024px 输入 PNG。点击任意样图可打开完整原图。'), '', tr('The sweater example at 1024px changes the requested color but fails to preserve image texture. ' 'At 2048px with tiling, both precisions better preserve the soft light and skin texture. ' 'RGB input, KV-cache-off and 1024px tiling checks did not visibly resolve that failure; ' 'an untiled 2048px call was stopped during memory-constrained decoding and is excluded. ' 'These few checks do not establish a root cause or universal editing reliability.', '1024px 毛衣改色虽完成颜色变化,但未保持原图质感;2048px 配合分块时,两种精度均较好保留柔和光线与皮肤纹理。' 'RGB 输入、关闭 KV 缓存及 1024px 分块尝试未明显改善该失败;一次未分块的 2048px 调用因解码显存受限终止,不计入结果。' '这些有限尝试尚不能确定根因或证明所有改图任务均可靠。'), ''] for item in data['cases']: label = item['zh' if zh else 'en'] lines.extend([f'#### {label}', '', '**Prompt:** ' + item['prompt'], '', tr('| Shared input | BF16 | INT8 |', '| 共同输入 | BF16 | INT8 |'), '|---|---|---|', '| ' + ' | '.join(picture(label+' '+name, item[key]) for name, key in [('input', 'input'), ('BF16', 'bf16'), ('INT8', 'int8')]) + ' |', '', item['observation_zh' if zh else 'observation_en'], '']) lines.extend([tr('#### Editing measurements (three-case timed set)', '#### 改图测量(三用例计时组)'), '', tr('The clothing-color, cup-material and bird-background cases each have one timed call per precision ' 'after one full-settings warmup. The older-woman sweater example is a separate cold, instrumented ' 'call and is shown for visual comparison only; its latency is not pooled here. ' 'These timings must not be compared directly with the 1024px mean.', '女性毛衣改色、杯子材质、翠鸟背景三个用例各在一次完整设置预热后计时,每种精度各调用一次。' '老年女性毛衣样例来自单独的、含记录开销的冷启动调用,仅作图像展示,耗时不混入本表。' '本表耗时不宜与 1024px 均值直接比较。'), '', tr('| Case | BF16 s | INT8 s | BF16 allocated peak GiB | INT8 allocated peak GiB |', '| 用例 | BF16 秒 | INT8 秒 | BF16 分配峰值 GiB | INT8 分配峰值 GiB |'), '|---|---:|---:|---:|---:|']) for row in data['measurements']: lines.append(f"| {row['case_id']} | {row['bf16_seconds']:.2f} | {row['int8_seconds']:.2f} | " f"{row['bf16_peak_gib']:.2f} | {row['int8_peak_gib']:.2f} |") lines.extend(['', tr('Every measured output from the three declared cases is included above. ' 'Visual observations are subjective and are not identity, material-recognition or instruction-following scores.', '三个预先声明用例的全部计时输出均在上文展示。视觉观察为主观描述,不属于身份、材质识别或指令遵循的量化评分。'), '', tr('Raw records and reproduction: ', '原始记录与复现:') + '[BF16](evaluation/editing/bf16/records.jsonl), [INT8](evaluation/editing/int8/records.jsonl), ' '[summary](evaluation/editing/summary.json), [process isolation](evaluation/editing/process-isolation.jsonl), ' '[cases](benchmarks/editing.json), [measured case-file bytes](evaluation/editing/measured-cases.zip), [runner](scripts/benchmark_edits.py).', '', tr('Editing example using the pipeline loaded above:', '使用上文已加载的流水线编辑:'), '', '```python', 'from PIL import Image', 'pipe.vae.enable_tiling()', 'image = pipe(', ' prompt="Change only the blue sweater to a red sweater. Preserve the same person, face, pose, lighting and background.",', ' image=Image.open("input.png"),', ' width=2048, height=2048, output_resolution=2048,', ' num_inference_steps=40, true_cfg_scale=1.0, use_kv_cache=True,', ' generator=torch.Generator("cpu").manual_seed(42),', ').images[0]', 'image.save("edit.png")', '```', '']) return '\n'.join(lines)