Repository navigation
[PT FE] Fix timm model filter selecting huge models, update timm to 1.0.30, support aten.meshgrid in FX - #38443
Conversation
….meshgrid in FX - Fix filter_timm size ordering (was alphabetical) and recognize parameter-count (7b, so400m), width-multiplier (50x3, 32x8d) and f/e size tokens, so the smallest variant of each architecture is selected. This removes multi-GB models that made the nightly runner run out of memory. - Update timm to 1.0.30 and regenerate timm_models. - Add FX translator for aten.meshgrid and enable meshgrid layer tests in export mode. - Document how to run model hub tests and reuse the model cache.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The filter still retains large one-letter iFormer size variants instead of selecting only the smallest model.
Review effort: Balanced
Findings: 1
What changed in this PR
Reduces PyTorch timm nightly memory usage, updates timm, and adds FX support for aten.meshgrid.
Changes:
- Improves timm model filtering and regenerates the model scope.
- Adds shared meshgrid conversion with TorchScript/FX tests.
- Documents model-hub testing and caching.
| File | Description |
|---|---|
tests/model_hub_tests/pytorch/timm_models |
Regenerates the timm model scope. |
tests/model_hub_tests/pytorch/test_timm.py |
Improves model-size filtering. |
tests/model_hub_tests/pytorch/envs/timm.txt |
Updates timm to 1.0.30. |
tests/layer_tests/pytorch_tests/test_listunpack.py |
Adds FX meshgrid coverage. |
src/frontends/pytorch/src/utils.hpp |
Declares shared meshgrid builder. |
src/frontends/pytorch/src/utils.cpp |
Implements meshgrid decomposition. |
src/frontends/pytorch/src/transforms/prim_list_unpack_replacer.cpp |
Reuses shared decomposition. |
src/frontends/pytorch/src/op/meshgrid.cpp |
Converts known lists and supports FX. |
src/frontends/pytorch/src/op_table.cpp |
Registers FX meshgrid overloads. |
src/frontends/pytorch/README.md |
Documents model-hub testing. |
.github/agents-prototype/skills/conversion-issues/pytorch.md |
Links model-hub guidance. |
.claude/skills/ov-update-pytorch-version/SKILL.md |
Adds model-test and cache instructions. |
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Use one translator for TorchScript and FX. When the input list is known at conversion, decompose meshgrid directly and return a list, otherwise keep deferring to PrimListUnpackReplacer. Share the decomposition in build_meshgrid.
Recognize t and h as size tokens when the name has no other size token, so iformer_h/iformer_s fold into iformer_t and efficientnetv2_rw_s into efficientnetv2_rw_t, while efficientnet_h_b5 and regnetz_040_h keep h as a variant marker.
DunnBC22/efficientformer-l3-300-Brain_Tumors_Image_Classification was removed from HF Hub, which fails the nightly scope2 HF Transformers step and skips the LLM, Detectron2 and Torchbench steps after it. Use the original snap-research/efficientformer-l1-300 checkpoint instead.
Nightly PyTorch Models Scope1/Scope2 jobs ran only on schedule. Also run them for PRs that change PyTorch model hub tests (checked in the Smart_CI job) and on workflow_dispatch with the pytorch-models-nightly input.
cyankiwi/Qwen3.5-4B-AWQ-4bit is a multimodal checkpoint. AutoModelForCausalLM loads it with text_config, which has no quantization_config, so the model is loaded unquantized and patch_quantized fails with 'Unknown quantization type: None'.
The multimodal checkpoint can't be loaded correctly via AutoModelForCausalLM: transformers<5.8 drops its quantization_config, and newer versions still don't match its ignore list to the text-only module names.
…erged Reverts the wrap_with_autocast translator (030af3e); it is added in openvinotoolkit#38396.
Build legacy setup.py packages in isolation to avoid the kernels egg_info plugin, and allow numpy<2 pickled inputs of maml models with numpy 2.
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
Review effort: Lite
Findings: 2
Open (5)
The workflow input name contains a hyphen (pytorch-models-nightly), so… · New The workflow input name contains a hyphen (pytorch-models-nightly), so… · New For FX,indexingis typically not passed as a positional input. This code calls… · Newtorch.meshgridonly accepts 0D/1D inputs (and errors for higher-rank tensors), but this… · New These environment variables are set process-wide insetup_classand never restored, which can… · New
| NodeVector reshapes; | ||
| auto const_neg_1 = v0::Constant::create(element::i32, Shape{1}, {-1}); | ||
| auto const_1 = v0::Constant::create(element::i32, Shape{1}, {1}); | ||
| for (size_t i = 0; i < inputs.size(); ++i) { |
There was a problem hiding this comment.
torch.meshgrid itself rejects inputs with rank > 1, so a valid model can't reach this decomposition with such inputs. Keeping it as is.
| os.environ["PIP_BUILD_CONSTRAINT"] = build_constraints | ||
| os.environ["PIP_CONSTRAINT"] = build_constraints | ||
| # build legacy setup.py packages in isolation, so setuptools plugins from the test env | ||
| # (e.g. kernels egg_info writer) are not loaded | ||
| os.environ["PIP_USE_PEP517"] = "1" |
There was a problem hiding this comment.
Torchbench tests run in a separate pytest invocation, which is the last step of the job, so these variables don't affect other tests. Keeping it simple.
| # parameter count, e.g. "300m", "7b", "so400m" | ||
| param_count_pattern = re.compile(r"^(?:so)?(\d+)([mb])$") | ||
| # depth/cardinality x width multiplier, e.g. "50x1", "152x4", "32x8d" | ||
| width_multiplier_pattern = re.compile(r"^(\d+)x(\d+)d?$") |
There was a problem hiding this comment.
[nitpick] This is brittle. width_multiplier_pattern = r"^(\d+)x(\d+)d?$" would misclassify a hypothetical NxN resolution token (e.g. 224x224) as a large width multiplier and skew size ranking. No such tokens exist in the current timm name set and test_models_list_complete validates the regenerated list, so impact is limited to test selection.
| with open(deps_file) as f: | ||
| deps = f.read() | ||
| with open(deps_file, "w") as f: | ||
| f.write(deps.replace('"torchvision", "torchaudio"]', '"torchvision"]')) |
There was a problem hiding this comment.
[nitpick] This is brittle. deps.replace('"torchvision", "torchaudio"]', '"torchvision"]') is mostly acceptable thanks to pinning of the torchbench commit.


Details:
filter_timmsorted size tokens alphabetically (enormous<giant< ... <small) and didn't recognize7b/so400m, so it picked the largest variants (e.g.vit_7b_dinov3, 26.9 GB). Several of these were loaded at the same time under-n 4.filter_timmnow keeps the smallest variant of each architecture. Size tokens are ordered by size, parameter counts and baret/hsizes are recognized, and width-multiplier variants (resnetv2_50x3,resnext101_32x8d) are folded into their base architecture (they use the same ops).timm_modelsis regenerated: 517 models, down from 532. The largest model is now 4.05 GB, and total weights drop from ~248 GB to ~108 GB. New failing models are marked xfail:iformer_*(numpy<2 load error) andgemma4_vit_167m*in export mode.aten::meshgridis now converted during translation for both TorchScript and FX.PrimListUnpackReplaceris still the fallback when the input list is unknown at that point. This fixes export mode for 9 new timm models and meshgrid outputs used directly bystack/cat/[i].DunnBC22/efficientformer-l3-300-Brain_Tumors_Image_Classificationwas removed from HF Hub. That failure also skips the LLM, Detectron2 and Torchbench steps. The model is replaced withsnap-research/efficientformer-l1-300.qwen3_compressed_tensors(cyankiwi/Qwen3.5-4B-AWQ-4bit, a multimodal checkpoint) is marked xfail. With the pinned transformers 5.5.3,AutoModelForCausalLMdrops itsquantization_config(fixed in 5.8, Fix: propagate quantization_config to text sub-config for composite models in AutoModelForCausalLM huggingface/transformers#45494). Newer versions still don't match the checkpoint's ignore list to the text-only module names, solinear_attn.in_proj_a/bare initialized randomly.install.py, which requires torchaudio. torchaudio was dropped from the requirements in [PT FE] Upgrade tests to torch 2.12 #36098 and doesn't support torch 2.14. The test removes torchaudio from torchbench'sTORCH_DEPS, pinssetuptools<81for sdist builds (visdomneedspkg_resources), and setsPIP_USE_PEP517=1. With pip 24, legacysetup.pypackages are built in the test venv, where theegg_infohook ofkernels(installed for LLM tests) crashes against the olderhuggingface_hubinstalled by torchbench. The maml models' inputs, pickled with numpy<2, now load with numpy 2.convit_tiny(trace): the model fills a cache on its first forward, so the test runs one warm-up forward first.ExportedProgramare taken fromout_spec. A key is skipped if it's ambiguous (one tensor under several keys, or the same key in several nested dicts) or matches the name of another graph node or input.efficientvit_b0(export): fixed by [PyTorch] Support exported grad-mode and autocast regions without decompositions #38396, now passes.PyTorch Models Nightly Scope1/Scope2 testsjobs inubuntu_22.ymlnow also run for PRs that changetests/model_hub_tests/pytorch,tests/model_hub_tests/models_hub_commonorjob_pytorch_models_tests.yml. TheSmart_CIjob checks the PR's changed files withgit diffon the merge commit, without extra API calls. The jobs also run on manual dispatch with the newpytorch-models-nightlyinput. They use the same runner and settings as the nightly, and aren't part ofOverall_Status, so a failure doesn't block merge. This PR runs them itself. Moved from [CI] Run nightly PyTorch model hub scopes on related PRs and on dispatch #38457.Tickets:
AI Assistance:
test_models_list_complete: passes.