今天我们来做一件很具体的事:在魔搭 Code Workspace 的一张 NVIDIA A10 上,完整部署 SenseNova/SenseNova-U1.5-8B-MoT 正式版,然后直接在实例里运行官方 Python 推理脚本,看看它能不能生成一张 2048×2048 的信息图。
这台实例有 8 个 CPU 核心、24GB 显存,系统实际内存约 28GiB,而且没有交换分区。模型目录落盘后约 33GiB,正式出图还要加载一份约 778MiB 的 8 步 LoRA。LoRA 可以先理解成一份额外加载的小型适配文件,这里用它把正式生成压到 8 步。
过程没有想象中那么顺。模型下载后存储一度到了 98.7%;GitHub 连续三种下载方式都中断;官方依赖准备重新下载一个 889MB 的 PyTorch;环境里没有 /usr/bin/time;第一次为了省资源把分辨率降到 512,图虽然出来了,文字和布局却几乎不能用。
好在这些问题最后都解决了。我们先用 512 一步冒烟确认链路,再跑 512 和 2048 的 8 步 LoRA。8 步方案很快,2048 生成阶段约 148 秒,但两张正式图依然偏糊,其中一张还把 FOCUS 写成了 FOOUS。
于是我又补跑了一次不加载 LoRA 的 50 步基座,并开启 Thinking。它最终把画质救了回来:三阶段关系清楚、图标和边缘锐利,画面里的三处英文标题也全部正确。代价是生成阶段来到 1202秒,完整进程约 23 分钟。本文会把这条从“能出图”走到“图能用”的过程完整展开。
这里用的是 SenseNova U1.5 正式版,不是 U1、U1 Pro 或 U1.5 Preview。几个名称看起来接近,权重入口和推理条件并不相同,复制命令前先把仓库名核对完整。

下面我们从空终端开始,一步一步把它跑起来。
第一步:先确认这台魔搭实例够不够
实例启动后,先打开终端查看显卡、内存和工作台存储:
nvidia-smi
free -h
df -h /mnt/workspace
终端识别到的是 NVIDIA A10,显存总量 24564MiB,当前没有其他 GPU 进程。系统有 8 个 CPU 核心,实际可见内存约 28GiB,交换分区是 0。
交换分区可以理解成磁盘上的“临时内存”。它比真正的内存慢很多,但内存快用完时还能临时兜一下。这台实例没有这个缓冲,一旦模型和 Python 进程把 28GiB 内存吃满,任务可能直接被系统终止。

这也是为什么不能只看“A10 24GB”就开始下载。SenseNova U1.5 会通过 GPU 和 CPU 分层加载:一部分模块进显卡,一部分留在系统内存。显存压力降下来了,内存压力会跟着上升。
存储也要提前算。正式模型的文件目录落盘约 33GiB;LoRA、Python 环境、依赖缓存、日志和 2048 原图还会继续占空间。只准备刚好 33GiB,通常走不到最后一步。

可以先记下三组数:工作台还剩多少可写空间,GPU 计划给模型多少预算,系统内存扣掉其他进程后还有多少。三项都有余量,再开始几十 GB 的下载。
这里尤其容易误判的是系统内存。–max_memory "0=20GiB,cpu=16GiB" 中的 16GiB,只约束 Accelerate 自动放置模型时使用多少 CPU 内存。Python 解释器、图片张量、解码和保存过程还会额外占用内存,因此最终 RSS 会高于 16GiB。
显存同样要留余地。A10 虽然显示 24564MiB,但 CUDA 上下文和生成阶段的临时张量不会消失。如果把 max_memory 直接写到 24GiB,模型分层可能会把空间安排得太满,真正开始生成时反而更容易失败。这次把 GPU 预算放在 20GiB,就是先给运行时留一块缓冲。
第二步:用ModelScope命令下载完整模型
先给这次实验单独建目录,模型、日志和输出图都放在里面:
mkdir -p /mnt/workspace/sensenova-u15-deploy/{logs,outputs,models}
cd /mnt/workspace/sensenova-u15-deploy
然后直接使用魔搭的 ModelScope CLI 下载正式版权重:
modelscope download SenseNova/SenseNova-U1.5-8B-MoT \\
–local-dir models/SenseNova-U1.5-8B-MoT \\
–max-workers 8
这次一共下载 19 个文件,用时约 2 分。终端最后显示 Snapshot ready,但我们还要确认模型索引里记录的 8 个 safetensors 权重分片都已经落盘,避免运行几分钟后才发现缺少某一片。

ModelScope 这一段反而很顺,接下来准备官方推理代码时,网络问题才真正开始。
第三步:GitHub下载连续失败,换通道也要确认代码没变
第一次先按常规方式浅克隆官方仓库:
git clone –depth 1 \\
https://github.com/OpenSenseNova/SenseNova-U1.git repo
终端随后报错:
GnuTLS recv error (-110): The TLS connection was non-properly terminated
随后我尝试下载 codeload ZIP,在 17.4MB 处又遇到:
curl: (18) transfer closed with outstanding read data remaining
再改成直接取 raw 文件,连接依然超时。

如果只是不断换镜像,文件也许很快就能凑齐,但我们无法确认不同通道拿到的是不是同一版代码。最后采用的办法是先固定官方提交:
f97964a6e54b0abf92aa2db849af4e942bb2ff08
接着通过 GitHub API 取得这个提交的文件树,只选出推理需要的 37 个文件,换可用通道逐个下载,再按照 Git blob 的计算方式核对每个文件的 SHA。
最终终端返回:
SOURCE_VERIFIED 37 of 37 bad []

如果你的实例能够稳定访问 GitHub,正常克隆官方仓库会更简单,只要再记录实际 commit 即可。逐文件恢复是这次连续中断后的备用路线,不需要在网络正常时特意把流程变复杂。
这个结果表示 37 个文件全部与目标提交一致,bad 列表为空。以后再碰到 GitHub 中断,也可以沿用这个思路:先固定 commit,再换通道,最后做完整性校验。代理地址可以变,目标版本不能跟着变。
这一步也把网络问题拆成两层。连接中断时,先解决文件怎样传过来;传输恢复后,再确认内容是否属于目标版本。只处理第一层,可能拿到残缺或错版文件;只盯着第二层,又会在网络不稳定时反复失败。把两件事分开,后面的依赖安装才有明确起点。
如果校验结果出现一个 bad 文件,先单独重取这个文件,不要急着继续安装。源码一旦进入 Python 环境,后面的导入错误、参数错误和张量错误会离真正原因越来越远。
第四步:安装依赖,没必要重新下载整套PyTorch
魔搭镜像已经预装 Python 3.12.13、PyTorch 2.10.0+cu128 和 CUDA 12.8。第一次直接按官方依赖安装时,pip 又准备下载一个 889MB 的 PyTorch 2.8 wheel。
等了大约 18 分钟,只下载了 51MB。于是我中止这次下载,重新创建一个可以复用系统包的虚拟环境:
python -m venv –system-site-packages .venv
grep -vE '^(–extra-index-url|torch==|torchvision==)' \\
repo/requirements.txt > requirements-no-torch.txt
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install -r requirements-no-torch.txt
.venv/bin/python -m pip install -e repo –no-deps
.venv/bin/python -m pip install 'transformers==4.57.1'
这里没有直接修改官方 requirements.txt,而是另外生成 requirements-no-torch.txt。以后环境出问题时,两份文件可以直接对照,也能看清我们究竟跳过了哪些依赖。
安装完成后,先运行下面两条命令:
.venv/bin/python -c "import torch,transformers,accelerate,sensenova_u1; print(torch.__version__, torch.version.cuda, torch.cuda.is_available()); print(transformers.__version__, accelerate.__version__); print(sensenova_u1.__file__)"
.venv/bin/python repo/examples/t2i/inference.py –help
终端确认 PyTorch 2.10.0+cu128、CUDA 可用、Transformers 4.57.1、Accelerate 1.14.0,项目模块也能正常导入。官方 inference.py –help 可以完整输出,接下来就能进入真实模型加载。

这里复用系统 PyTorch,并不是因为“版本越新越好”。CUDA 可见、模块可导入、帮助命令正常,都还不能替代真正生成一张图片。
这几项检查分别排除不同的问题。torch.cuda.is_available() 返回真,说明 PyTorch 能看到显卡;项目模块可以导入,说明当前依赖没有在最初阶段冲突;inference.py –help 能展开,说明官方入口的参数解析与主要导入链路可以工作。真正开始读取 8 个权重分片后,才会继续暴露模型格式、显存分层和生成阶段的问题。
保留原始 requirements 还有一个好处:以后更新官方仓库时,可以直接比较上游依赖有没有变化。如果在原文件上手工删掉 torch 和 torchvision,几天后很难判断某一行究竟是官方要求,还是自己临时改过的结果。另建过滤版会多一个文件,却少了很多版本排查的猜测。
第五步:下载8步LoRA,给GPU和CPU分好预算
正式版的快速推理需要配套的 8 步 LoRA,仍然通过 ModelScope 下载:
modelscope download SenseNova/SenseNova-U1.5-8B-MoT-LoRAs \\
–local-dir models/SenseNova-U1.5-8B-MoT-LoRAs \\
–max-workers 8
sha256sum models/SenseNova-U1.5-8B-MoT-LoRAs/\\
SenseNova-U1.5-8B-MoT-LoRA-8step.safetensors
文件约 778MiB,SHA-256 为:
3ef32180cdf1e30a870a83f4f136e897ea50b7ee467f863d75633464ebb25708
它与官方发布值一致。

接下来是这台 24GB A10 能不能装载模型的关键参数:
–device_map auto
–max_memory "0=20GiB,cpu=16GiB"
–attn_backend sdpa
device_map auto 让 Accelerate 自动决定哪些模块放到显卡、哪些留在 CPU 内存。0=20GiB 给 GPU 自动分层留出 20GiB 预算,没有把 24GB 全部许给模型;cpu=16GiB 则约束分层阶段使用的 CPU 内存。
SDPA 是 PyTorch 自带的注意力实现,可以少装一个 FlashAttention。官方脚本实际使用 BF16,也就是一种较低精度的浮点格式。下面的截图可以看到,官方脚本本身就提供了 device_map 和 max_memory 参数,不需要为了分层另改模型代码。
命令里的 cfg_scale、cfg_norm 和 timestep_shift 会影响生成过程。这次先沿用项目的8步推理组合,不在第一次部署时同时改动这些参数。等基线图跑通后,再一次只调整一个变量,结果会更容易比较。

要注意,20GiB 和 16GiB 是自动放置模块时的预算,不是整个进程的最终上限。CUDA 上下文、临时张量、图像解码和 Python 本身还会继续占资源,所以正式运行时仍要观察实际峰值。
脚本的 –profile 会同时给出 allocated 和 reserved。前者是当前张量真正使用的显存,后者还包含 PyTorch 为后续分配提前保留的部分。只看 allocated,可能低估进程已经圈住的空间;只在任务结束后看一次 nvidia-smi,又可能错过生成阶段最高的那一刻。两组数和 CPU RSS 一起记录,换参数时才知道压力究竟被移到了哪里。
这套分层不是让模型变小,而是把一部分负担从 GPU 搬到系统内存。它适合解决“单张 24GB 显卡能否完成一次生成”,代价是 CPU 内存和加载时间都会增加。若机器只有 24GB 系统内存,或者另一个 Notebook 正在占内存,就算显存看起来还有空余,也可能在模型加载后半段失败。
第六步:开始Python调用,先跑512的一步冒烟
完整模型第一次加载接近 3 分钟。如果一上来就跑 2048×2048 和 8 步,最后才发现路径或参数写错,会白等很久。
第一轮先用 512×512、1 步调用官方 Python 脚本:
{ time -p .venv/bin/python repo/examples/t2i/inference.py \\
–model_path models/SenseNova-U1.5-8B-MoT \\
–prompt "A clean flat vector poster of a blue robot watering a small green plant, white background, simple composition" \\
–output outputs/t2i-smoke.png \\
–width 512 –height 512 –num_steps 1 –cfg_scale 1.0 \\
–device_map auto –max_memory "0=20GiB,cpu=16GiB" \\
–attn_backend sdpa –profile; } 2>&1 | tee logs/42-t2i-smoke.log
这里还有一个小插曲:镜像中没有 /usr/bin/time,所以改用 Bash 自带的 time -p。它会在命令结束后打印完整墙钟时间,官方脚本的 –profile 则负责记录模型加载、生成和资源峰值。
这次模型顺利读完 8 个权重分片,GPU/CPU 分层完成,生成循环正常结束,PNG 也写进了 outputs。终端记录的模型加载时间为 147秒,完整进程 299 秒。

打开图片后只有一团模糊色块,这很正常。一步扩散的任务只是确认整条调用链已经工作,不是测试画质。

到这里,我们已经确认 Python 脚本能在当前环境里加载完整模型并输出文件。接下来再加入 LoRA,把步数提高到 8。
如果这一轮失败,排查范围会比直接跑正式图小很多。权重分片没读完,就先检查模型文件;模型加载后立刻显存不足,就调整分层预算;生成循环开始后出错,再看注意力后端和图片参数;命令返回成功但没有 PNG,则检查输出路径和写盘空间。一步冒烟的价值,就是把这些问题挡在 2048 正式任务之前。
第七步:512八步能出图,却不是正确的省资源办法
为了继续控制成本,我先保留 512×512,只把步数提升到 8:
{ time -p .venv/bin/python repo/examples/t2i/inference.py \\
–model_path models/SenseNova-U1.5-8B-MoT \\
–lora_path models/SenseNova-U1.5-8B-MoT-LoRAs/SenseNova-U1.5-8B-MoT-LoRA-8step.safetensors \\
–prompt "A polished square infographic poster titled AI STUDY PLAN, three clean steps with icons: READ, PRACTICE, REVIEW, blue and orange palette, white background, crisp vector design, legible typography" \\
–output outputs/u15-8step-infographic.png \\
–width 512 –height 512 –cfg_scale 1.0 –cfg_norm none \\
–timestep_shift 3.0 –num_steps 8 \\
–device_map auto –max_memory "0=20GiB,cpu=16GiB" \\
–attn_backend sdpa –profile; } 2>&1 | tee logs/45-u15-8step-infographic.log
命令确实生成了一张方形海报,但终端同时明确警告:512×512 不在模型的训练分辨率集合里。打开原图后,标题、分区和小字都明显失真。

这次失败非常有用。图像分辨率不是可以随意拧小的开关。降低分辨率会减少图像 token 和部分资源消耗,但偏离训练分辨率桶后,节省下来的资源可能直接从构图和文字质量里扣回来。
所以没有继续尝试 768 或 1024,而是回到官方 1:1 训练桶 2048×2048。要省资源,优先从模型分层、步数和重复加载入手,不要先破坏模型熟悉的输入条件。
第八步:回到2048,8步方案仍然不够清晰
2048×2048 的 8 步命令如下:
{ time -p .venv/bin/python repo/examples/t2i/inference.py \\
–model_path models/SenseNova-U1.5-8B-MoT \\
–lora_path models/SenseNova-U1.5-8B-MoT-LoRAs/SenseNova-U1.5-8B-MoT-LoRA-8step.safetensors \\
–prompt "A premium square infographic poster titled AI STUDY PLAN. Three numbered sections: 1 READ, 2 PRACTICE, 3 REVIEW. Navy blue and warm orange, white background, clean grid, crisp vector icons, modern editorial design, sharp legible English typography." \\
–output outputs/u15-8step-infographic-2048.png \\
–width 2048 –height 2048 –cfg_scale 1.0 –cfg_norm none \\
–timestep_shift 3.0 –num_steps 8 \\
–device_map auto –max_memory "0=20GiB,cpu=16GiB" \\
–attn_backend sdpa –profile; } 2>&1 | tee logs/46-u15-8step-infographic-2048.log
这次没有再出现训练分辨率警告。模型加载用时 183 秒,生成阶段 148秒,完整进程 365秒。峰值已分配显存 19.81GiB,峰值保留显存 20.15GiB,CPU RSS 为 21.71GiB。
RSS 可以理解成进程真正占住的物理内存。21.71GiB 放在这台约 28GiB、没有 swap 的实例上,已经不能算宽松,因此运行时不适合再开第二个大模型任务。
图片顺利写入硬盘,版面也比 512 对照组完整。但打开原图后,问题并没有消失:边缘偏软,小字像伪文字,几个分区虽然存在,离可以直接交付的信息图仍有明显距离。

我又把画面简化,只要求一个大标题 FOCUS、一个机器人和少量图标,希望减少文字后能够稳定一些。主体确实更集中,标题却被写成了 FOOUS。

第二次 2048 任务的完整进程为 378秒,生成阶段 147 秒,CPU RSS 到了 22.43GiB。到这里可以确认两件事:单张 A10 可以稳定完成 2048 的 8 步生成,但“命令完成”和“图片可交付”是两个不同的终点。
如果只部署,8 步结果已经足够;我没有继续换同类提示词碰运气,而是回到官方完整质量配置,看看问题到底来自模型上限,还是快速本身。
第九步:去掉8步LoRA,50步基座把画质救了回来
这次不再加载 8 步 LoRA,把步数提高到 50,cfg_scale 调回 4.0,同时开启官方脚本的 –think。这里的 Thinking 会先把用户提示词整理成更具体的画面计划,再进入图像生成。
重新运行前又冒出一个依赖问题。当前虚拟环境里的 tokenizers 已经变成 0.23.1,而 Transformers 4.57.1 要求它低于 0.23,官方脚本在导入阶段直接停止。修复只需要把项目虚拟环境里的版本固定回 0.22.1:
.venv/bin/python -m pip install 'tokenizers==0.22.1'
.venv/bin/python -c "import tokenizers,transformers; print(tokenizers.__version__, transformers.__version__)"
终端重新输出 0.22.1 4.57.1,inference.py –help 也恢复正常。随后运行完整质量任务:
{ time -p .venv/bin/python repo/examples/t2i/inference.py \\
–model_path models/SenseNova-U1.5-8B-MoT \\
–prompt "Create a polished square visual infographic with no text, no letters, no numbers. Theme: AI learning workflow. Three clearly separated visual stages connected by a flowing path: reading a book, practicing on a laptop, reviewing with a checklist. Friendly blue robot guide, navy blue and warm orange palette, crisp flat vector illustration, clean white background, strong visual hierarchy, sharp edges, consistent icons, generous whitespace. Absolutely no typography, captions, labels, symbols resembling text, watermark or logo." \\
–output outputs/u15-base-50step-quality.png \\
–width 2048 –height 2048 –cfg_scale 4.0 –cfg_norm none \\
–timestep_shift 3.0 –num_steps 50 –seed 42 \\
–think –print_think \\
–device_map auto –max_memory "0=20GiB,cpu=16GiB" \\
–attn_backend sdpa –profile; } 2>&1 | tee logs/49-u15-base-50step-quality.log
这次等待明显更久:模型加载 198秒,生成阶段 1202秒,完整时间 1426 秒,也就是约 23 分钟。峰值已分配显存 20.79GiB,保留显存 21.29GiB,CPU RSS 为 20.73GiB。

但最终效果完全不同。新图的机器人、书本、电脑和清单边缘清晰,三块内容通过橙色路径自然串联,配色和视觉层级也已经像一张完整的信息图。

还有一个意外:提示词明明要求不要任何文字,Thinking 展开的画面计划却主动加入了 Reading a Book、Practicing on a Laptop、Reviewing with a Checklist 三个标题。最终三个标题都拼写正确,但它也说明 Thinking 不是机械照抄提示词,而是会重新组织任务。它能帮助复杂构图,也可能改动你原本以为很硬的限制。

这张图的文件分辨率 2048×2048,RGB 模式
这里不能把提升全部归功于某一个参数,因为这一轮同时去掉了 8 步 LoRA、提高到 50 步、调整了 CFG 并开启 Thinking。能够确认的是:在同一台 A10、同一套权重和同一官方脚本下,完整质量组合确实把最终效果从模糊草稿提升到了可展示水平。
我们终于部署成功了:五次调用结果放在一起看
五次调用的记录如下:
| 512×512,1步冒烟 | 147.851秒 | 136.961秒 | 299.12秒 | 18.74/18.77GiB | 19.80GiB |
| 512×512,8步LoRA | 167.563秒 | 135.526秒 | 336.56秒 | 18.75/19.23GiB | 20.43GiB |
| 2048×2048,8步LoRA | 183.788秒 | 148.219秒 | 365.45秒 | 19.81/20.15GiB | 21.71GiB |
| 2048×2048,8步约束提示 | 178.930秒 | 147.715秒 | 378.27秒 | 19.81/20.15GiB | 22.43GiB |
| 2048×2048,50步基座+Thinking | 198.516秒 | 1202.261秒 | 1426.07秒 | 20.79/21.29GiB | 20.73GiB |

8 步和 50 步并不是谁能完全替代谁。前者把生成阶段压到约 148 秒,适合快速确认环境、构图方向和提示词大意;后者的生成阶段超过 20 分钟,但这次拿到了真正能展示的结果。免费实例的时间有限,比较合理的顺序是先用一步冒烟检查链路,再用 8 步试构图,方向确定后只跑一次 50 步质量图。
跑到这一步,完整模型已经在实例内由官方 Python 脚本直接调用,五次任务都正常退出,三张 2048 PNG 也已经写盘。
如果以后封装成长驻 API,重复加载的三分钟左右成本可以尝试省掉,但请求超时、并发隔离和长时间资源占用都要重新实测。
最后复盘:今天遇到的七个问题怎么解决
第一个问题是存储空间。模型刚下载完成,配额就到了 98.7%。这种情况下继续装依赖、写缓存和保存 2048 原图都可能失败。处理顺序是先暂停,确认哪些大文件可以恢复,再给后续环境和输出留出真实空间。
第二个问题是 GitHub 传输中断。git clone、codeload ZIP 和 raw 文件连续失败后,先固定官方提交,再换下载通道,最后用 Git blob SHA 核对 37 个文件。
第三个问题是依赖重复下载。镜像已经有可用的 CUDA PyTorch,官方 requirements 又准备下载 889MB wheel。最后用 –system-site-packages 复用系统包,原依赖文件继续保留,过滤规则单独放在另一份文件里。
第四个问题是 Python 包版本漂移。先固定 Transformers 4.57.1,补跑质量图时又发现 tokenizers 0.23.1 已经越过兼容范围。把它固定为 0.22.1 后,版本检查、官方帮助和 50 步任务都恢复正常。虚拟环境能够复用系统包,也意味着排错时要同时看“装了什么”和“Python 实际导入了什么”。

第五个问题是计时命令不存在。/usr/bin/time 缺失并不是模型错误,换成 Bash 自带的 time -p 就能继续。先判断报错发生在模型加载前还是加载后,可以避免把普通命令问题误判成显存不足。
第六个问题是为了省资源同时牺牲了分辨率和步数。512 不在这次官方训练分辨率集合,画面最差;回到 2048 后版面完整了,8 步 LoRA 的细节仍然偏糊。最后换成 2048 的 50 步基座组合,画质才真正恢复。省算力时最好一次只降一个变量,否则看到差图也很难知道是谁造成的。
第七个问题是图中文字。8 步图把 FOCUS 写成了 FOOUS;50 步图的三处英文标题虽然全对,Thinking 却没有遵守“不要文字”的原始要求。信息图出完以后,既要逐字检查,也要回看 Thinking 有没有改变任务约束。文件生成成功,只能说明程序跑完,不能替你确认内容正确。

这次的模型效果怎么样
只看 8 步样例,会以为模型最多能给出一个模糊的版式草稿;50 步基座图则证明,同一张 A10 仍然能够得到清晰、层级完整、可直接展示的 2048 信息图。算力不是完全不够,而是需要在速度档和质量档之间作取舍。
8 步方案的优势是快,2048 生成约 148 秒,适合排查环境和尝试构图。50 步基座加 Thinking 的结果明显更好,代价是生成阶段 1202秒,整次调用 1426秒。对于免费实例,它适合方向确定后的少量成图,不适合不停抽卡。
资源上也还有边界。50 步任务峰值保留显存 21.29GiB,在 24GB A10 上能跑,但余量不大;系统内存峰值在五次任务中最高达到 22.43GiB,而实例总内存约 28GiB且没有 swap。
文字表现不能因为这一张全对就下普遍结论。8 步图已经出现过明确错字,50 步图也发生了 Thinking 改写约束。课程表、价格、日期、步骤编号和品牌名仍要打开原图逐项核对。如果要求每个字都能编辑、每次都零错误,生成模型后面仍应接排版工具。
这次在魔搭 A10 上,我们从 ModelScope 下载完整权重,恢复并校验官方源码,处理存储、网络和依赖问题,完成 GPU/CPU 分层,再用五次 Python 调用把链路、速度档和质量档逐层跑通。

如果你也使用 24GB 显存、接近 28GiB 内存的实例,可以先用 512 一步确认链路,再用 2048 八步检查构图。方向确定后只跑一次 50 步质量图;打开原图把版面、文字和任务约束逐项核对,三项都过关,这次生成就可以结束了。



