Skip to content

Migrate task files to new GraphBuilder input/output APIs - #231

Merged
justinchuby merged 2 commits into
mainfrom
onnxscript-graphbuilder-api
May 1, 2026
Merged

Migrate task files to new GraphBuilder input/output APIs#231
justinchuby merged 2 commits into
mainfrom
onnxscript-graphbuilder-api

Conversation

@justinchuby

Copy link
Copy Markdown
Member

Summary

Migrate all 24 task files under src/mobius/tasks/ to use the new onnxscript GraphBuilder.input() and GraphBuilder.add_output() APIs, replacing manual ir.Value() construction and graph.outputs.append() patterns.

Changes

  • _base.py: _make_graph() no longer takes an inputs parameter. Inputs are now created via builder.input(name, dtype, shape) which auto-registers them on the graph.
  • _cache_utils.py: Cache helper functions (_make_kv_cache_inputs, _make_hybrid_cache_inputs, _register_kv_cache_outputs, _register_hybrid_cache_outputs) now take builder as first parameter. Return types simplified — flat input lists removed since builder.input() auto-registers.
  • All 24 task files: ir.Value(name=..., shape=ir.Shape(...), type=ir.TensorType(...))builder.input(name, dtype=..., shape=[...]); value.name = name; graph.outputs.append(value)builder.add_output(value, name)
  • Import cleanup: GraphBuilder imported from public onnxscript namespace instead of onnxscript._internal.builder
  • Naming consistency: Standardized builder variable name across all files

Impact

  • 24 files changed, 571 insertions, 903 deletions (net -332 lines)
  • Eliminates dual-bookkeeping anti-pattern (separate input list + graph registration)
  • Input ordering structurally guaranteed by call order
  • Output registration is atomic (single call vs two-step name+append)
  • All 2662 tests pass

Note

op.call() migration for module/function invocations is out of scope — op.call() currently only accepts ir.Function, not nn.Module, and treats kwargs as ONNX attributes rather than tensor inputs. This requires upstream onnxscript changes.

justinchuby and others added 2 commits May 1, 2026 18:34
Replace manual ir.Value() graph input creation with builder.input()
and graph.outputs.append() with builder.add_output() across all 24
task files under src/mobius/tasks/.

Key changes:
- _make_graph() no longer takes an inputs parameter; graph starts empty
  and inputs are registered via builder.input() after creation.
- _make_kv_cache_inputs() and _make_hybrid_cache_inputs() now take
  builder as first parameter, use builder.input(), and return only
  the cache pairs (no flat input list).
- _register_kv_cache_outputs() and _register_hybrid_cache_outputs()
  now take builder instead of graph and use builder.add_output().
- All caller task files updated to the new control flow: create graph
  first, then register inputs via builder.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchu@microsoft.com>
- Rename graph_builder to builder in _gemma4.py and
  _vision_language_3model.py for consistency with other 22 task files
- Change GraphBuilder import from onnxscript._internal.builder (private)
  to onnxscript (public API) in _base.py, _cache_utils.py, _causal_lm.py,
  _gemma4.py
- Fix import sorting and line length issues flagged by lintrunner
- Update _make_graph() docstring to mention builder.add_output()

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchu@microsoft.com>
@github-actions

github-actions Bot commented May 1, 2026

Copy link
Copy Markdown

Performance Comparison

Comparing 419467e0e2a065

Model Metric Baseline Current Delta
bert (feature-extraction) model_size_bytes 359 KB 359 KB +0.0%
bert (feature-extraction) num_nodes 60 60 +0.0%
falcon model_size_bytes 364 KB 364 KB +0.0%
falcon num_nodes 66 66 +0.0%
gemma2 model_size_bytes 428 KB 428 KB +0.0%
gemma2 num_nodes 107 107 +0.0%
gpt2 model_size_bytes 388 KB 388 KB +0.0%
gpt2 num_nodes 53 53 +0.0%
llama model_size_bytes 425 KB 425 KB +0.0%
llama num_nodes 61 61 +0.0%
llama (static-cache) model_size_bytes 425 KB 425 KB +0.0%
llama (static-cache) num_nodes 58 58 +0.0%
mamba (ssm-text-generation) model_size_bytes 296 KB 296 KB +0.0%
mamba (ssm-text-generation) num_nodes 98 98 +0.0%
phi3 model_size_bytes 421 KB 421 KB +0.0%
phi3 num_nodes 59 59 +0.0%
phi3 (static-cache) model_size_bytes 421 KB 421 KB +0.0%
phi3 (static-cache) num_nodes 56 56 +0.0%
qwen2 model_size_bytes 425 KB 425 KB +0.0%
qwen2 num_nodes 61 61 +0.0%
qwen2 (static-cache) model_size_bytes 425 KB 425 KB +0.0%
qwen2 (static-cache) num_nodes 58 58 +0.0%
qwen3_5_moe (hybrid-text-generation) model_size_bytes 506 KB 506 KB +0.0%
qwen3_5_moe (hybrid-text-generation) num_nodes 275 275 +0.0%
qwen3_5_text (hybrid-text-generation) model_size_bytes 458 KB 458 KB +0.0%
qwen3_5_text (hybrid-text-generation) num_nodes 129 129 +0.0%
qwen3_5_vl (hybrid-qwen-vl) model_size_bytes 977 KB 977 KB +0.0%
qwen3_5_vl (hybrid-qwen-vl) num_nodes 408 408 +0.0%
t5 (seq2seq) model_size_bytes 836 KB 836 KB +0.0%
t5 (seq2seq) num_nodes 166 166 +0.0%
whisper (speech-to-text) model_size_bytes 1008 KB 1008 KB +0.0%
whisper (speech-to-text) num_nodes 128 128 +0.0%

No performance regressions.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates src/mobius/tasks/ graph construction to the newer onnxscript.GraphBuilder.input() / GraphBuilder.add_output() APIs, removing manual ir.Value(...) creation and direct graph.outputs.append(...) mutations to simplify and standardize task I/O registration.

Changes:

  • Refactors _make_graph() to create empty graphs and rely on builder.input() for input registration.
  • Updates cache helper utilities to accept builder and to return only structured cache tuples (no flat “graph_inputs” lists).
  • Converts all task implementations to use builder.input(...) and builder.add_output(...), with related import cleanup.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/mobius/tasks/_base.py Updates _make_graph() to start with empty inputs/outputs and documents builder-driven I/O registration.
src/mobius/tasks/_cache_utils.py Refactors KV/hybrid cache input/output helpers to register I/O via builder and simplify return types.
src/mobius/tasks/_causal_lm.py Migrates dynamic/static cache task graph wiring to builder-driven input/output registration.
src/mobius/tasks/_gemma4.py Migrates Gemma4 task graphs and its custom KV-cache input builder to builder.input() / builder.add_output().
src/mobius/tasks/_vision_language.py Migrates vision-language single-model task I/O to builder APIs and updated cache helper signatures.
src/mobius/tasks/_vision_language_3model.py Migrates 3-model VLM task component graphs (vision + decoder) to builder APIs.
src/mobius/tasks/_multimodal.py Migrates multimodal task inputs/outputs and KV-cache wiring to builder APIs.
src/mobius/tasks/_phi4mm_multimodal.py Migrates Phi4mm multi-component graphs (vision/audio/embedding) to builder APIs.
src/mobius/tasks/_speech_to_text.py Migrates encoder/decoder graphs and KV-cache wiring to builder APIs.
src/mobius/tasks/_speech_language.py Migrates audio encoder graph I/O to builder APIs.
src/mobius/tasks/_tts.py Migrates talker/code-predictor/embedding/speaker-encoder graphs and KV-cache wiring to builder APIs.
src/mobius/tasks/_seq2seq.py Migrates encoder/decoder graphs and rewires self/cross KV-cache inputs/outputs using builder APIs.
src/mobius/tasks/_ssm_causal_lm.py Migrates SSM causal LM state inputs/outputs to builder APIs.
src/mobius/tasks/_vae.py Migrates VAE encoder/decoder graphs to builder APIs.
src/mobius/tasks/_qwen_image_vae.py Migrates Qwen Image VAE encoder/decoder graphs to builder APIs.
src/mobius/tasks/_video_denoising.py Migrates video denoising graph I/O to builder APIs.
src/mobius/tasks/_denoising.py Migrates denoising (UNet2D) graph I/O to builder APIs.
src/mobius/tasks/_controlnet.py Migrates ControlNet graph I/O and multi-output registration to builder APIs.
src/mobius/tasks/_codec.py Migrates codec encoder/decoder graphs to builder APIs.
src/mobius/tasks/_feature_extraction.py Migrates feature extraction graph inputs/outputs to builder APIs.
src/mobius/tasks/_audio_feature_extraction.py Migrates audio feature extraction graph I/O to builder APIs.
src/mobius/tasks/_image_classification.py Migrates image classification graph I/O to builder APIs.
src/mobius/tasks/_object_detection.py Migrates object detection graph I/O (multiple outputs) to builder APIs.
src/mobius/tasks/_adapter.py Migrates adapter task graph I/O (conditional input + variable outputs) to builder APIs.

@codecov

codecov Bot commented May 1, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.80420% with 12 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/mobius/tasks/_multimodal.py 0.00% 10 Missing ⚠️
src/mobius/tasks/_cache_utils.py 92.00% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented May 1, 2026

Copy link
Copy Markdown

🏗️ Architecture Diff

Comparing 419467e0e2a065

Model Sub-model Changes Status
bert (feature-extraction) model 0
falcon model 0
gemma2 model 0
gemma4 (gemma4) decoder 0
gemma4 (gemma4) embedding 0
gemma4 (gemma4) vision_encoder 0
gemma4_text model 0
gpt2 model 0
llama model 0
llama (static-cache) model 0
mamba (ssm-text-generation) model 0
phi3 model 0
phi3 (static-cache) model 0
qwen model 0
qwen (static-cache) model 0
qwen2 model 0
qwen2 (static-cache) model 0
qwen2_moe model 0
qwen2_moe (static-cache) model 0
qwen3 model 0
qwen3 (static-cache) model 0
qwen3_5_moe (hybrid-text-generation) model 0
qwen3_5_text (hybrid-text-generation) model 0
qwen3_5_vl (hybrid-qwen-vl) decoder 0
qwen3_5_vl (hybrid-qwen-vl) embedding 0
qwen3_5_vl (hybrid-qwen-vl) vision_encoder 0
qwen3_moe model 0
qwen3_moe (static-cache) model 0
qwen3_next (hybrid-text-generation) model 0
t5 (seq2seq) decoder 0
t5 (seq2seq) encoder 0
whisper (speech-to-text) decoder 0
whisper (speech-to-text) encoder 0

No architecture changes detected.


Legend: ⚪ No change · 🔵 Minor (attrs/inits) · 🟡 Moderate (nodes added/removed) · 🔴 Major (interface changed)

@justinchuby
justinchuby marked this pull request as draft May 1, 2026 18:53
@justinchuby
justinchuby marked this pull request as ready for review May 1, 2026 18:55
@justinchuby

Copy link
Copy Markdown
Member Author

@titaiwangms @gramalingam

@justinchuby
justinchuby merged commit 4e70d8d into main May 1, 2026
27 checks passed
@justinchuby
justinchuby deleted the onnxscript-graphbuilder-api branch May 1, 2026 20:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants