Buckets:
| import{s as rt,n as jt,o as dt}from"../chunks/scheduler.56725da7.js";import{S as ut,i as ct,e as a,s as t,c as U,h as It,a as y,d as M,b as n,f as mt,g as p,j as i,k as wt,l as ft,m as s,n as T,t as o,o as J,p as C}from"../chunks/index.18a26576.js";import{C as At}from"../chunks/CopyLLMTxtMenu.4edc7eaa.js";import{C as w}from"../chunks/CodeBlock.543bbd4c.js";import{H as m}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.59c1e4a7.js";function ht(Js){let r,me,Je,we,j,re,d,je,u,Cs="This guide explains how to add custom model implementations to the <code>optimum/neuron/models/training/</code> directory. Custom models are needed to support distributed training features like tensor parallelism, pipeline parallelism, and sequence parallelism on AWS Trainium devices.",de,c,ue,I,ce,f,ms="The <code>NeuronModelMixin</code> class provides core functionality:",Ie,A,ws="<li><code>from_pretrained()</code>: Loads regular Transformers weights into custom implementations</li> <li><code>save_pretrained()</code>: Saves sharded checkpoints with consolidation metadata</li> <li>Pipeline parallelism support through <code>PIPELINE_*</code> attributes</li>",fe,h,Ae,b,rs="Transformation specs handle converting weights between:",he,Z,js="<li>Original Transformers format → Custom parallel format (during loading)</li> <li>Custom parallel format → Original Transformers format (during checkpoint consolidation)</li>",be,_,ds="Key transformation spec types:",Ze,W,us="<li><code>FusedLinearsSpec</code>: Handles fused linear layers (e.g., <code>gate_up_proj</code>)</li> <li><code>GQAQKVColumnParallelLinearSpec</code>: Handles grouped query attention projections when the tensor parallel size is greater than the number of key-value heads</li>",_e,g,cs='For complete API documentation of all transformation specs and utility functions, see the <a href="../training_api/transformations">Model Weight Transformation Specs API Reference</a>.',We,V,ge,B,Is="Use these parallel layers from <code>neuronx_distributed</code>:",Ve,k,fs="<li><code>ColumnParallelLinear</code>: Splits weight matrix along output dimension</li> <li><code>RowParallelLinear</code>: Splits weight matrix along input dimension</li> <li><code>ParallelEmbedding</code>: Splits embedding table across ranks</li> <li><code>GQAQKVColumnParallelLinear</code>: Specialized for grouped query attention projections when the tensor parallel size is greater than the number of key-value heads</li>",Be,G,ke,X,Ge,v,As="Create a new directory: <code>optimum/neuron/models/training/your_model/</code>",Xe,$,hs="<strong><code>__init__.py</code></strong>",ve,R,$e,Q,Re,Y,bs="<strong><code>modeling_your_model.py</code></strong>",Qe,F,Ye,N,Fe,x,Ne,z,xe,E,ze,S,Zs="<strong>Important</strong>: Any module that has transformation specs must inherit from <code>CustomModule</code> to ensure proper handling of weight transformations, and the transformation specs must be defined in the <code>self.specs</code> attribute.",Ee,L,Se,H,Le,q,_s="The attention layer implementation depends on the model’s architecture and tensor parallel configuration. There are three main variants:",He,P,Ws="<strong>1. Separate Q, K, V Projections (Default)</strong>",qe,K,Pe,D,gs="<strong>2. Fused QKV Projection (Multi-Head Attention)</strong>",Ke,O,De,ll,Vs="<strong>3. GQA QKV Projection (Required for Challenging TP Configurations)</strong>",Oe,el,lM,Ml,Bs="<strong>When to Use Each Variant:</strong>",eM,sl,ks="<li><strong>Separate Q, K, V</strong>: Default approach, works for all configurations but may be less efficient</li> <li><strong>Fused QKV</strong>: Use when <code>num_heads == num_key_value_heads</code> (no grouped query attention) and <code>fuse_qkv=True</code></li> <li><strong>GQA QKV</strong>: Required when using grouped query attention with challenging tensor parallel configurations where KV heads cannot be evenly distributed across TP ranks</li>",MM,tl,Gs="The choice is typically determined by:",sM,nl,tM,al,nM,yl,aM,il,yM,Ul,iM,pl,UM,Tl,pM,ol,Xs="Update <code>optimum/neuron/models/training/__init__.py</code>:",TM,Jl,oM,Cl,vs="Update <code>optimum/neuron/models/training/auto_models.py</code>:",JM,ml,CM,wl,$s="Here <code>"your_model"</code> is the corresponding to the <code>model_type</code> attribute of your model’s configuration class.",mM,rl,wM,jl,rM,dl,Rs="<li>Use <code>gather_output=False</code> for intermediate layers</li> <li>Set <code>input_is_parallel=True</code> for layers that receive parallel input</li> <li>Configure <code>sequence_parallel_enabled</code> consistently across layers</li> <li>Use appropriate <code>stride</code> values for proper weight sharding</li>",jM,ul,dM,cl,Qs="<li>Always define specs for modules that use fused or parallel layers</li> <li>Use <code>CustomModule</code> mixin for any module with transformation specs</li> <li>Ensure spec parameter names match the actual module structure</li> <li>Test both regular and LoRA weight transformations</li>",uM,Il,cM,fl,Ys="<li>Set <code>SUPPORTS_PIPELINE_PARALLELISM = True</code> for supported models</li> <li>Define <code>PIPELINE_TRANSFORMER_LAYER_CLS</code> as your decoder layer class</li> <li>List all input names in <code>PIPELINE_INPUT_NAMES</code></li>",IM,Al,fM,hl,Fs="<li>Set <code>_supports_flash_attn_2 = True</code> if your model supports it</li> <li>Implement both eager and flash attention paths</li> <li>Use appropriate attention function dispatching</li>",AM,bl,hM,Zl,Ns=`The training tests in <code>tests/training/</code> provide a comprehensive testing framework that validates numerical correctness, distributed training scenarios, and checkpoint compatibility. | |
| Most of the tests are not designed to be run on every custom modeling implementation, but rather to validate the core functionality of the Optimum Neuron training infrastructure. | |
| With that in mind, here’s what you need to implement for your custom modeling:`,bM,_l,ZM,Wl,xs="The <code>test_custom_modeling.py</code> file validates that your custom implementation produces identical outputs to the original Transformers model:",_M,gl,zs="Update <code>tests/training/test_custom_modeling.py</code>:",WM,Vl,gM,Bl,Es="<strong>Important</strong>: For custom modeling validation tests, use small/tiny models to ensure CI efficiency. The test models should have:",VM,kl,Ss="<li>Small vocabulary size (e.g., 1000-8000 tokens)</li> <li>Few layers (e.g., 2-4 layers)</li> <li>Small hidden dimensions (e.g., 128-512)</li> <li>Minimal attention heads (e.g., 4-8 heads)</li>",BM,Gl,Ls="Examples of good test models for custom modeling validation:",kM,Xl,Hs="<li><code>"michaelbenayoun/llama-2-tiny-4kv-heads-4layers-random"</code> - 4 layers, 4 KV heads</li> <li><code>"michaelbenayoun/granite-tiny-4kv-heads-4layers-random"</code> - Tiny Granite model</li> <li><code>"michaelbenayoun/qwen3-tiny-4kv-heads-4layers-random"</code> - Tiny Qwen3 model</li>",GM,vl,qs="Key test your model must pass:",XM,$l,vM,Rl,Ps="<li><strong>Numerical Correctness</strong>: Ensures custom models match Transformers outputs exactly</li> <li><strong>Parallelization Support</strong>: Tests various QKV implementations (regular, fused, GQA)</li>",$M,Ql,RM,Yl,Ks="The <code>test_overfit.py</code> file validates training convergence. To include your model in end-to-end training validation, you must add it to the parametrized test cases:",QM,Fl,Ds="Update <code>tests/training/test_overfit.py</code>:",YM,Nl,FM,xl,Os="This validates:",NM,zl,lt="<li><strong>Convergence Validation</strong>: Ensures models can overfit simple datasets</li>",xM,El,et="Your model will be tested in:",zM,Sl,EM,Ll,SM,Hl,Mt="The <code>test_modeling_auto.py</code> file validates that your model can be loaded using the <code>NeuronModel</code> and <code>NeuronModelForCausalLM</code> auto classes. To include your model in these tests, you must add it to the test cases:",LM,ql,st="Update <code>tests/training/test_modeling_auto.py</code>:",HM,Pl,qM,Kl,tt="This validates:",PM,Dl,nt="<li><strong>Auto Model Loading</strong>: Tests that <code>NeuronModel.from_pretrained()</code> and <code>NeuronModel.from_config()</code> work correctly</li> <li><strong>Auto CausalLM Loading</strong>: Tests that <code>NeuronModelForCausalLM.from_pretrained()</code> and <code>NeuronModelForCausalLM.from_config()</code> work correctly</li>",KM,Ol,DM,le,at="Tests require AWS Trainium instances. Run specific test categories:",OM,ee,ls,Me,es,se,yt="Your implementation must:",Ms,te,it="<li><strong>Pass numerical correctness tests</strong> against original Transformers implementation</li> <li><strong>Support parallelization strategies</strong> (at minimum DP and TP; PP support recommended)</li> <li><strong>Handle various QKV implementations</strong> (regular, fused, GQA)</li> <li><strong>Support checkpoint consolidation</strong> for distributed training</li> <li><strong>Support LoRA training</strong> if applicable</li> <li><strong>Demonstrate convergence</strong> through overfitting tests</li>",ss,ne,Ut="The testing framework ensures your custom model maintains compatibility with the existing Optimum Neuron training infrastructure while delivering expected performance and correctness guarantees.",ts,ae,ns,ye,pt="<li><strong>Weight Shape Mismatches</strong>: Ensure transformation specs handle tensor shapes correctly</li> <li><strong>Pipeline Parallelism Errors</strong>: Check that all required attributes are set</li> <li><strong>Memory Issues</strong>: Consider gradient checkpointing and activation recomputation</li> <li><strong>Attention Compatibility</strong>: Verify attention implementations work with your model architecture</li>",as,ie,ys,Ue,Tt="This guide provides the foundation for implementing custom models. For complete examples and advanced patterns, reference these existing implementations:",is,pe,ot="<li><strong>LLaMA</strong>: <code>optimum/neuron/models/training/llama/modeling_llama.py</code> - Complete implementation with (regular, fused and GQA attention), fused MLP</li> <li><strong>Qwen3</strong>: <code>optimum/neuron/models/training/qwen3/modeling_qwen3.py</code> - Demonstrates how to adapt the Llama implementation for Qwen3 with <code>q_norm</code> and <code>k_norm</code> layers</li>",Us,Te,Jt="Key files to study:",ps,oe,Ct="<li><code>optimum/neuron/models/training/modeling_utils.py</code> - Base <code>NeuronModelMixin</code> class</li> <li><code>optimum/neuron/models/training/transformations_utils.py</code> - Weight transformation specifications</li> <li><code>optimum/neuron/models/training/config.py</code> - <code>TrainingNeuronConfig</code> for parallelism settings</li>",Ts,Ce,os;return j=new At({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),d=new m({props:{title:"Contributing Custom Models for Training",local:"contributing-custom-models-for-training",headingTag:"h1"}}),c=new m({props:{title:"Architecture Components",local:"architecture-components",headingTag:"h2"}}),I=new m({props:{title:"1. NeuronModelMixin",local:"1-neuronmodelmixin",headingTag:"h3"}}),h=new m({props:{title:"2. Weight Transformation Specs",local:"2-weight-transformation-specs",headingTag:"h3"}}),V=new m({props:{title:"3. Parallel Layers",local:"3-parallel-layers",headingTag:"h3"}}),G=new m({props:{title:"Implementation Steps",local:"implementation-steps",headingTag:"h2"}}),X=new m({props:{title:"Step 1: Create Model Structure",local:"step-1-create-model-structure",headingTag:"h3"}}),R=new w({props:{code:"ZnJvbSUyMC5tb2RlbGluZ195b3VyX21vZGVsJTIwaW1wb3J0JTIwWW91ck1vZGVsRm9yQ2F1c2FsTE0lMkMlMjBZb3VyTW9kZWwlMEElMEFfX2FsbF9fJTIwJTNEJTIwJTVCJTIyWW91ck1vZGVsRm9yQ2F1c2FsTE0lMjIlMkMlMjAlMjJZb3VyTW9kZWwlMjIlNUQ=",highlighted:`<span class="hljs-keyword">from</span> .modeling_your_model <span class="hljs-keyword">import</span> YourModelForCausalLM, YourModel | |
| __all__ = [<span class="hljs-string">"YourModelForCausalLM"</span>, <span class="hljs-string">"YourModel"</span>]`,lang:"python",wrap:!1}}),Q=new m({props:{title:"Step 2: Implement the Model Building Blocks",local:"step-2-implement-the-model-building-blocks",headingTag:"h3"}}),F=new m({props:{title:"Imports and Dependencies",local:"imports-and-dependencies",headingTag:"h4"}}),N=new w({props:{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwdG9yY2glMjBpbXBvcnQlMjBubiUwQWZyb20lMjBuZXVyb254X2Rpc3RyaWJ1dGVkLnBhcmFsbGVsX2xheWVycy5sYXllcnMlMjBpbXBvcnQlMjAoJTBBJTIwJTIwJTIwJTIwQ29sdW1uUGFyYWxsZWxMaW5lYXIlMkMlMEElMjAlMjAlMjAlMjBSb3dQYXJhbGxlbExpbmVhciUyQyUwQSUyMCUyMCUyMCUyMFBhcmFsbGVsRW1iZWRkaW5nJTJDJTBBKSUwQWZyb20lMjBuZXVyb254X2Rpc3RyaWJ1dGVkLm1vZHVsZXMucWt2X2xpbmVhciUyMGltcG9ydCUyMEdRQVFLVkNvbHVtblBhcmFsbGVsTGluZWFyJTBBZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFByZVRyYWluZWRNb2RlbCUwQWZyb20lMjB0cmFuc2Zvcm1lcnMubW9kZWxzLnlvdXJfbW9kZWwlMjBpbXBvcnQlMjBZb3VyTW9kZWxDb25maWclMEElMEFmcm9tJTIwLi5jb25maWclMjBpbXBvcnQlMjBUcmFpbmluZ05ldXJvbkNvbmZpZyUwQWZyb20lMjAuLm1vZGVsaW5nX3V0aWxzJTIwaW1wb3J0JTIwTmV1cm9uTW9kZWxNaXhpbiUwQWZyb20lMjAuLnRyYW5zZm9ybWF0aW9uc191dGlscyUyMGltcG9ydCUyMCglMEElMjAlMjAlMjAlMjBDdXN0b21Nb2R1bGUlMkMlMEElMjAlMjAlMjAlMjBGdXNlZExpbmVhcnNTcGVjJTJDJTBBJTIwJTIwJTIwJTIwR1FBUUtWQ29sdW1uUGFyYWxsZWxMaW5lYXJTcGVjJTJDJTBBJTIwJTIwJTIwJTIwTW9kZWxXZWlnaHRUcmFuc2Zvcm1hdGlvblNwZWNzJTJDJTBBKQ==",highlighted:`<span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> torch <span class="hljs-keyword">import</span> nn | |
| <span class="hljs-keyword">from</span> neuronx_distributed.parallel_layers.layers <span class="hljs-keyword">import</span> ( | |
| ColumnParallelLinear, | |
| RowParallelLinear, | |
| ParallelEmbedding, | |
| ) | |
| <span class="hljs-keyword">from</span> neuronx_distributed.modules.qkv_linear <span class="hljs-keyword">import</span> GQAQKVColumnParallelLinear | |
| <span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> PreTrainedModel | |
| <span class="hljs-keyword">from</span> transformers.models.your_model <span class="hljs-keyword">import</span> YourModelConfig | |
| <span class="hljs-keyword">from</span> ..config <span class="hljs-keyword">import</span> TrainingNeuronConfig | |
| <span class="hljs-keyword">from</span> ..modeling_utils <span class="hljs-keyword">import</span> NeuronModelMixin | |
| <span class="hljs-keyword">from</span> ..transformations_utils <span class="hljs-keyword">import</span> ( | |
| CustomModule, | |
| FusedLinearsSpec, | |
| GQAQKVColumnParallelLinearSpec, | |
| ModelWeightTransformationSpecs, | |
| )`,lang:"python",wrap:!1}}),x=new m({props:{title:"Embedding Layer",local:"embedding-layer",headingTag:"h4"}}),z=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxFbWJlZGRpbmdzKG5uLk1vZHVsZSklM0ElMEElMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmJTJDJTIwY29uZmlnJTJDJTIwdHJuX2NvbmZpZyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdXBlcigpLl9faW5pdF9fKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmVtYmVkX3Rva2VucyUyMCUzRCUyMFBhcmFsbGVsRW1iZWRkaW5nKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbmZpZy52b2NhYl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29uZmlnLmhpZGRlbl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZHR5cGUlM0Rjb25maWcuZHR5cGUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZXF1ZW5jZV9wYXJhbGxlbF9lbmFibGVkJTNEdHJuX2NvbmZpZy5zZXF1ZW5jZV9wYXJhbGxlbF9lbmFibGVkJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKQ==",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelEmbeddings</span>(nn.Module): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config</span>): | |
| <span class="hljs-built_in">super</span>().__init__() | |
| self.embed_tokens = ParallelEmbedding( | |
| config.vocab_size, | |
| config.hidden_size, | |
| dtype=config.dtype, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| )`,lang:"python",wrap:!1}}),E=new m({props:{title:"MLP Layer with Fused Linears",local:"mlp-layer-with-fused-linears",headingTag:"h4"}}),L=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxNTFAobm4uTW9kdWxlJTJDJTIwQ3VzdG9tTW9kdWxlKSUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBjb25maWclMkMlMjB0cm5fY29uZmlnKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuaGlkZGVuX3NpemUlMjAlM0QlMjBjb25maWcuaGlkZGVuX3NpemUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmludGVybWVkaWF0ZV9zaXplJTIwJTNEJTIwY29uZmlnLmludGVybWVkaWF0ZV9zaXplJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwRnVzZWQlMjBnYXRlJTIwYW5kJTIwdXAlMjBwcm9qZWN0aW9ucyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuZ2F0ZV91cF9wcm9qJTIwJTNEJTIwQ29sdW1uUGFyYWxsZWxMaW5lYXIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5oaWRkZW5fc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDIlMjAqJTIwc2VsZi5pbnRlcm1lZGlhdGVfc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN0cmlkZSUzRDIlMkMlMjAlMjAlMjMlMjBJbXBvcnRhbnQlMjBmb3IlMjBwcm9wZXIlMjBzaGFyZGluZyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdhdGhlcl9vdXRwdXQlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlM0R0cm5fY29uZmlnLnNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkdHlwZSUzRGNvbmZpZy5kdHlwZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmRvd25fcHJvaiUyMCUzRCUyMFJvd1BhcmFsbGVsTGluZWFyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuaW50ZXJtZWRpYXRlX3NpemUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmhpZGRlbl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmlhcyUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRfaXNfcGFyYWxsZWwlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUzRHRybl9jb25maWcuc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEY29uZmlnLmR0eXBlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMERlZmluZSUyMHRyYW5zZm9ybWF0aW9uJTIwc3BlY3MlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzJTIwJTNEJTIwTW9kZWxXZWlnaHRUcmFuc2Zvcm1hdGlvblNwZWNzKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzLmFkZF9zcGVjKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEZ1c2VkTGluZWFyc1NwZWMoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZnVzZWRfbGluZWFyX25hbWUlM0QlMjJnYXRlX3VwX3Byb2olMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW5lYXJfbmFtZXMlM0QlNUIlMjJnYXRlX3Byb2olMjIlMkMlMjAlMjJ1cF9wcm9qJTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmlhcyUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZnVzZV9heGlzJTNEJTIyY29sdW1uJTIyJTJDJTIwJTIwJTIzJTIwRnVzZSUyMGFsb25nJTIwb3V0cHV0JTIwZGltZW5zaW9uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3JpZ2luYWxfZGltcyUzRCU1QnNlbGYuaW50ZXJtZWRpYXRlX3NpemUlMkMlMjBzZWxmLmludGVybWVkaWF0ZV9zaXplJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCk=",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelMLP</span>(nn.Module, CustomModule): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config</span>): | |
| <span class="hljs-built_in">super</span>().__init__() | |
| self.hidden_size = config.hidden_size | |
| self.intermediate_size = config.intermediate_size | |
| <span class="hljs-comment"># Fused gate and up projections</span> | |
| self.gate_up_proj = ColumnParallelLinear( | |
| self.hidden_size, | |
| <span class="hljs-number">2</span> * self.intermediate_size, | |
| stride=<span class="hljs-number">2</span>, <span class="hljs-comment"># Important for proper sharding</span> | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| self.down_proj = RowParallelLinear( | |
| self.intermediate_size, | |
| self.hidden_size, | |
| bias=<span class="hljs-literal">False</span>, | |
| input_is_parallel=<span class="hljs-literal">True</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| <span class="hljs-comment"># Define transformation specs</span> | |
| self.specs = ModelWeightTransformationSpecs() | |
| self.specs.add_spec( | |
| FusedLinearsSpec( | |
| fused_linear_name=<span class="hljs-string">"gate_up_proj"</span>, | |
| linear_names=[<span class="hljs-string">"gate_proj"</span>, <span class="hljs-string">"up_proj"</span>], | |
| bias=<span class="hljs-literal">False</span>, | |
| fuse_axis=<span class="hljs-string">"column"</span>, <span class="hljs-comment"># Fuse along output dimension</span> | |
| original_dims=[self.intermediate_size, self.intermediate_size], | |
| ) | |
| )`,lang:"python",wrap:!1}}),H=new m({props:{title:"Attention Layer",local:"attention-layer",headingTag:"h4"}}),K=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxBdHRlbnRpb24obm4uTW9kdWxlJTJDJTIwQ3VzdG9tTW9kdWxlKSUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBjb25maWclMkMlMjB0cm5fY29uZmlnJTJDJTIwbGF5ZXJfaWR4KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuY29uZmlnJTIwJTNEJTIwY29uZmlnJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5udW1faGVhZHMlMjAlM0QlMjBjb25maWcubnVtX2F0dGVudGlvbl9oZWFkcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYubnVtX2tleV92YWx1ZV9oZWFkcyUyMCUzRCUyMGNvbmZpZy5udW1fa2V5X3ZhbHVlX2hlYWRzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5oZWFkX2RpbSUyMCUzRCUyMGNvbmZpZy5oaWRkZW5fc2l6ZSUyMCUyRiUyRiUyMHNlbGYubnVtX2hlYWRzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU2VwYXJhdGUlMjBwcm9qZWN0aW9ucyUyMGZvciUyMFElMkMlMjBLJTJDJTIwViUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYucV9wcm9qJTIwJTNEJTIwQ29sdW1uUGFyYWxsZWxMaW5lYXIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29uZmlnLmhpZGRlbl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5udW1faGVhZHMlMjAqJTIwc2VsZi5oZWFkX2RpbSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdhdGhlcl9vdXRwdXQlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlM0R0cm5fY29uZmlnLnNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkdHlwZSUzRGNvbmZpZy5kdHlwZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmtfcHJvaiUyMCUzRCUyMENvbHVtblBhcmFsbGVsTGluZWFyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbmZpZy5oaWRkZW5fc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYubnVtX2tleV92YWx1ZV9oZWFkcyUyMColMjBzZWxmLmhlYWRfZGltJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmlhcyUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZ2F0aGVyX291dHB1dCUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUzRHRybl9jb25maWcuc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEY29uZmlnLmR0eXBlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYudl9wcm9qJTIwJTNEJTIwQ29sdW1uUGFyYWxsZWxMaW5lYXIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29uZmlnLmhpZGRlbl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5udW1fa2V5X3ZhbHVlX2hlYWRzJTIwKiUyMHNlbGYuaGVhZF9kaW0lMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBiaWFzJTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBnYXRoZXJfb3V0cHV0JTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZXF1ZW5jZV9wYXJhbGxlbF9lbmFibGVkJTNEdHJuX2NvbmZpZy5zZXF1ZW5jZV9wYXJhbGxlbF9lbmFibGVkJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZHR5cGUlM0Rjb25maWcuZHR5cGUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5vX3Byb2olMjAlM0QlMjBSb3dQYXJhbGxlbExpbmVhciglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLm51bV9oZWFkcyUyMColMjBzZWxmLmhlYWRfZGltJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29uZmlnLmhpZGRlbl9zaXplJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmlhcyUzREZhbHNlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRfaXNfcGFyYWxsZWwlM0RUcnVlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUzRHRybl9jb25maWcuc2VxdWVuY2VfcGFyYWxsZWxfZW5hYmxlZCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEY29uZmlnLmR0eXBlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME5vJTIwdHJhbnNmb3JtYXRpb24lMjBzcGVjcyUyMG5lZWRlZCUyMC0lMjByZWd1bGFyJTIwcGFyYWxsZWwlMjBsYXllcnMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzJTIwJTNEJTIwTW9kZWxXZWlnaHRUcmFuc2Zvcm1hdGlvblNwZWNzKCk=",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelAttention</span>(nn.Module, CustomModule): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config, layer_idx</span>): | |
| <span class="hljs-built_in">super</span>().__init__() | |
| self.config = config | |
| self.num_heads = config.num_attention_heads | |
| self.num_key_value_heads = config.num_key_value_heads | |
| self.head_dim = config.hidden_size // self.num_heads | |
| <span class="hljs-comment"># Separate projections for Q, K, V</span> | |
| self.q_proj = ColumnParallelLinear( | |
| config.hidden_size, | |
| self.num_heads * self.head_dim, | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| self.k_proj = ColumnParallelLinear( | |
| config.hidden_size, | |
| self.num_key_value_heads * self.head_dim, | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| self.v_proj = ColumnParallelLinear( | |
| config.hidden_size, | |
| self.num_key_value_heads * self.head_dim, | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| self.o_proj = RowParallelLinear( | |
| self.num_heads * self.head_dim, | |
| config.hidden_size, | |
| bias=<span class="hljs-literal">False</span>, | |
| input_is_parallel=<span class="hljs-literal">True</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| <span class="hljs-comment"># No transformation specs needed - regular parallel layers</span> | |
| self.specs = ModelWeightTransformationSpecs()`,lang:"python",wrap:!1}}),O=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxBdHRlbnRpb24obm4uTW9kdWxlJTJDJTIwQ3VzdG9tTW9kdWxlKSUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBjb25maWclMkMlMjB0cm5fY29uZmlnJTJDJTIwbGF5ZXJfaWR4KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMC4uLiUyMChzYW1lJTIwc2V0dXAlMjBhcyUyMGFib3ZlKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRwX3NpemUlMjAlM0QlMjBnZXRfdGVuc29yX21vZGVsX3BhcmFsbGVsX3NpemUoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME9ubHklMjB1c2UlMjBmdXNlZCUyMFFLViUyMHdoZW4lMjBudW1faGVhZHMlMjAlM0QlM0QlMjBudW1fa2V5X3ZhbHVlX2hlYWRzJTIwKG5vJTIwR1FBKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwdHJuX2NvbmZpZy5mdXNlX3FrdiUyMGFuZCUyMHNlbGYubnVtX2hlYWRzJTIwJTNEJTNEJTIwc2VsZi5udW1fa2V5X3ZhbHVlX2hlYWRzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5xa3ZfcHJvaiUyMCUzRCUyMENvbHVtblBhcmFsbGVsTGluZWFyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbmZpZy5oaWRkZW5fc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDMlMjAqJTIwc2VsZi5udW1faGVhZHMlMjAqJTIwc2VsZi5oZWFkX2RpbSUyQyUyMCUyMCUyMyUyMFElMjAlMkIlMjBLJTIwJTJCJTIwViUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN0cmlkZSUzRDMlMkMlMjAlMjAlMjMlMjBJbXBvcnRhbnQlMjBmb3IlMjBwcm9wZXIlMjBzaGFyZGluZyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdhdGhlcl9vdXRwdXQlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlM0R0cm5fY29uZmlnLnNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkdHlwZSUzRGNvbmZpZy5kdHlwZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBEZWZpbmUlMjB0cmFuc2Zvcm1hdGlvbiUyMHNwZWNzJTIwZm9yJTIwZnVzZWQlMjBRS1YlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzJTIwJTNEJTIwTW9kZWxXZWlnaHRUcmFuc2Zvcm1hdGlvblNwZWNzKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzLmFkZF9zcGVjKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEZ1c2VkTGluZWFyc1NwZWMoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZnVzZWRfbGluZWFyX25hbWUlM0QlMjJxa3ZfcHJvaiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbmVhcl9uYW1lcyUzRCU1QiUyMnFfcHJvaiUyMiUyQyUyMCUyMmtfcHJvaiUyMiUyQyUyMCUyMnZfcHJvaiUyMiU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZ1c2VfYXhpcyUzRCUyMmNvbHVtbiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9yaWdpbmFsX2RpbXMlM0QlNUJzZWxmLm51bV9oZWFkcyUyMColMjBzZWxmLmhlYWRfZGltJTVEJTIwKiUyMDMlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuc3BsaXRfc2l6ZSUyMCUzRCUyMHNlbGYubnVtX2hlYWRzJTIwKiUyMHNlbGYuaGVhZF9kaW0lMjAlMkYlMkYlMjB0cF9zaXpl",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelAttention</span>(nn.Module, CustomModule): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config, layer_idx</span>): | |
| <span class="hljs-built_in">super</span>().__init__() | |
| <span class="hljs-comment"># ... (same setup as above)</span> | |
| tp_size = get_tensor_model_parallel_size() | |
| <span class="hljs-comment"># Only use fused QKV when num_heads == num_key_value_heads (no GQA)</span> | |
| <span class="hljs-keyword">if</span> trn_config.fuse_qkv <span class="hljs-keyword">and</span> self.num_heads == self.num_key_value_heads: | |
| self.qkv_proj = ColumnParallelLinear( | |
| config.hidden_size, | |
| <span class="hljs-number">3</span> * self.num_heads * self.head_dim, <span class="hljs-comment"># Q + K + V</span> | |
| stride=<span class="hljs-number">3</span>, <span class="hljs-comment"># Important for proper sharding</span> | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| dtype=config.dtype, | |
| ) | |
| <span class="hljs-comment"># Define transformation specs for fused QKV</span> | |
| self.specs = ModelWeightTransformationSpecs() | |
| self.specs.add_spec( | |
| FusedLinearsSpec( | |
| fused_linear_name=<span class="hljs-string">"qkv_proj"</span>, | |
| linear_names=[<span class="hljs-string">"q_proj"</span>, <span class="hljs-string">"k_proj"</span>, <span class="hljs-string">"v_proj"</span>], | |
| bias=<span class="hljs-literal">False</span>, | |
| fuse_axis=<span class="hljs-string">"column"</span>, | |
| original_dims=[self.num_heads * self.head_dim] * <span class="hljs-number">3</span>, | |
| ) | |
| ) | |
| self.split_size = self.num_heads * self.head_dim // tp_size`,lang:"python",wrap:!1}}),el=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxBdHRlbnRpb24obm4uTW9kdWxlJTJDJTIwQ3VzdG9tTW9kdWxlKSUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBjb25maWclMkMlMjB0cm5fY29uZmlnJTJDJTIwbGF5ZXJfaWR4KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMC4uLiUyMChzYW1lJTIwc2V0dXAlMjBhcyUyMGFib3ZlKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRwX3NpemUlMjAlM0QlMjBnZXRfdGVuc29yX21vZGVsX3BhcmFsbGVsX3NpemUoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFVzZSUyMEdRQSUyMFFLViUyMHdoZW4lMjBLViUyMGhlYWRzJTIwY2FuJ3QlMjBiZSUyMGV2ZW5seSUyMGRpc3RyaWJ1dGVkJTIwYWNyb3NzJTIwVFAlMjByYW5rcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFRoaXMlMjBoYXBwZW5zJTIwd2hlbiUzQSUyMG51bV9rZXlfdmFsdWVfaGVhZHMlMjAlM0MlMjB0cF9zaXplJTIwb3IlMjBudW1fa2V5X3ZhbHVlX2hlYWRzJTIwJTI1JTIwdHBfc2l6ZSUyMCElM0QlMjAwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5xa3ZfbGluZWFyJTIwJTNEJTIwKHNlbGYubnVtX2tleV92YWx1ZV9oZWFkcyUyMCUzQyUyMHRwX3NpemUpJTIwb3IlMjAoc2VsZi5udW1fa2V5X3ZhbHVlX2hlYWRzJTIwJTI1JTIwdHBfc2l6ZSUyMCElM0QlMjAwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwc2VsZi5xa3ZfbGluZWFyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ2FsY3VsYXRlJTIwS1YlMjBzaXplJTIwbXVsdGlwbGllciUyMHRvJTIwZW5zdXJlJTIwZXZlbiUyMGRpc3RyaWJ1dGlvbiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwdHJuX2NvbmZpZy5rdl9zaXplX211bHRpcGxpZXIlMjBpcyUyME5vbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmt2X3NpemVfbXVsdGlwbGllciUyMCUzRCUyMHRybl9jb25maWcuYXV0b19rdl9zaXplX211bHRpcGxpZXIoc2VsZi5udW1fa2V5X3ZhbHVlX2hlYWRzKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmt2X3NpemVfbXVsdGlwbGllciUyMCUzRCUyMHRybl9jb25maWcua3Zfc2l6ZV9tdWx0aXBsaWVyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5xa3ZfcHJvaiUyMCUzRCUyMEdRQVFLVkNvbHVtblBhcmFsbGVsTGluZWFyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbmZpZy5oaWRkZW5fc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QnNlbGYubnVtX2hlYWRzJTIwKiUyMHNlbGYuaGVhZF9kaW0lMkMlMjBzZWxmLm51bV9rZXlfdmFsdWVfaGVhZHMlMjAqJTIwc2VsZi5oZWFkX2RpbSU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdhdGhlcl9vdXRwdXQlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlM0R0cm5fY29uZmlnLnNlcXVlbmNlX3BhcmFsbGVsX2VuYWJsZWQlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBrdl9zaXplX211bHRpcGxpZXIlM0RzZWxmLmt2X3NpemVfbXVsdGlwbGllciUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZ1c2VfcWt2JTNEdHJuX2NvbmZpZy5mdXNlX3FrdiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEY29uZmlnLmR0eXBlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMERlZmluZSUyMHRyYW5zZm9ybWF0aW9uJTIwc3BlY3MlMjBmb3IlMjBHUUElMjBRS1YlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzJTIwJTNEJTIwTW9kZWxXZWlnaHRUcmFuc2Zvcm1hdGlvblNwZWNzKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnNwZWNzLmFkZF9zcGVjKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEdRQVFLVkNvbHVtblBhcmFsbGVsTGluZWFyU3BlYyglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBncWFfcWt2X3Byb2plY3Rpb25fbmFtZSUzRCUyMnFrdl9wcm9qJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcXVlcnlfcHJvamVjdGlvbl9uYW1lJTNEJTIycV9wcm9qJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa2V5X3Byb2plY3Rpb25fbmFtZSUzRCUyMmtfcHJvaiUyMiUyQyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZhbHVlX3Byb2plY3Rpb25fbmFtZSUzRCUyMnZfcHJvaiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dF9wcm9qZWN0aW9uX25hbWUlM0QlMjJvX3Byb2olMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fYXR0ZW50aW9uX2hlYWRzJTNEc2VsZi5udW1faGVhZHMlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBudW1fa2V5X3ZhbHVlX2hlYWRzJTNEc2VsZi5udW1fa2V5X3ZhbHVlX2hlYWRzJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa3Zfc2l6ZV9tdWx0aXBsaWVyJTNEc2VsZi5rdl9zaXplX211bHRpcGxpZXIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBxX291dHB1dF9zaXplX3Blcl9wYXJ0aXRpb24lM0RzZWxmLnFrdl9wcm9qLnFfb3V0cHV0X3NpemVfcGVyX3BhcnRpdGlvbiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGt2X291dHB1dF9zaXplX3Blcl9wYXJ0aXRpb24lM0RzZWxmLnFrdl9wcm9qLmt2X291dHB1dF9zaXplX3Blcl9wYXJ0aXRpb24lMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmdXNlX3FrdiUzRHRybl9jb25maWcuZnVzZV9xa3YlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKQ==",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelAttention</span>(nn.Module, CustomModule): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config, layer_idx</span>): | |
| <span class="hljs-built_in">super</span>().__init__() | |
| <span class="hljs-comment"># ... (same setup as above)</span> | |
| tp_size = get_tensor_model_parallel_size() | |
| <span class="hljs-comment"># Use GQA QKV when KV heads can't be evenly distributed across TP ranks</span> | |
| <span class="hljs-comment"># This happens when: num_key_value_heads < tp_size or num_key_value_heads % tp_size != 0</span> | |
| self.qkv_linear = (self.num_key_value_heads < tp_size) <span class="hljs-keyword">or</span> (self.num_key_value_heads % tp_size != <span class="hljs-number">0</span>) | |
| <span class="hljs-keyword">if</span> self.qkv_linear: | |
| <span class="hljs-comment"># Calculate KV size multiplier to ensure even distribution</span> | |
| <span class="hljs-keyword">if</span> trn_config.kv_size_multiplier <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>: | |
| self.kv_size_multiplier = trn_config.auto_kv_size_multiplier(self.num_key_value_heads) | |
| <span class="hljs-keyword">else</span>: | |
| self.kv_size_multiplier = trn_config.kv_size_multiplier | |
| self.qkv_proj = GQAQKVColumnParallelLinear( | |
| config.hidden_size, | |
| [self.num_heads * self.head_dim, self.num_key_value_heads * self.head_dim], | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| sequence_parallel_enabled=trn_config.sequence_parallel_enabled, | |
| kv_size_multiplier=self.kv_size_multiplier, | |
| fuse_qkv=trn_config.fuse_qkv, | |
| dtype=config.dtype, | |
| ) | |
| <span class="hljs-comment"># Define transformation specs for GQA QKV</span> | |
| self.specs = ModelWeightTransformationSpecs() | |
| self.specs.add_spec( | |
| GQAQKVColumnParallelLinearSpec( | |
| gqa_qkv_projection_name=<span class="hljs-string">"qkv_proj"</span>, | |
| query_projection_name=<span class="hljs-string">"q_proj"</span>, | |
| key_projection_name=<span class="hljs-string">"k_proj"</span>, | |
| value_projection_name=<span class="hljs-string">"v_proj"</span>, | |
| output_projection_name=<span class="hljs-string">"o_proj"</span>, | |
| num_attention_heads=self.num_heads, | |
| num_key_value_heads=self.num_key_value_heads, | |
| kv_size_multiplier=self.kv_size_multiplier, | |
| q_output_size_per_partition=self.qkv_proj.q_output_size_per_partition, | |
| kv_output_size_per_partition=self.qkv_proj.kv_output_size_per_partition, | |
| fuse_qkv=trn_config.fuse_qkv, | |
| ) | |
| )`,lang:"python",wrap:!1}}),nl=new w({props:{code:"dHBfc2l6ZSUyMCUzRCUyMGdldF90ZW5zb3JfbW9kZWxfcGFyYWxsZWxfc2l6ZSgpJTBBdXNlX2dxYV9xa3YlMjAlM0QlMjAobnVtX2tleV92YWx1ZV9oZWFkcyUyMCUzQyUyMHRwX3NpemUpJTIwb3IlMjAobnVtX2tleV92YWx1ZV9oZWFkcyUyMCUyNSUyMHRwX3NpemUlMjAhJTNEJTIwMCklMEF1c2VfZnVzZWRfcWt2JTIwJTNEJTIwdHJuX2NvbmZpZy5mdXNlX3FrdiUyMGFuZCUyMChudW1faGVhZHMlMjAlM0QlM0QlMjBudW1fa2V5X3ZhbHVlX2hlYWRzKSUyMGFuZCUyMG5vdCUyMHVzZV9ncWFfcWt2",highlighted:`tp_size = get_tensor_model_parallel_size() | |
| use_gqa_qkv = (num_key_value_heads < tp_size) <span class="hljs-keyword">or</span> (num_key_value_heads % tp_size != <span class="hljs-number">0</span>) | |
| use_fused_qkv = trn_config.fuse_qkv <span class="hljs-keyword">and</span> (num_heads == num_key_value_heads) <span class="hljs-keyword">and</span> <span class="hljs-keyword">not</span> use_gqa_qkv`,lang:"python",wrap:!1}}),al=new m({props:{title:"Step 3: Implement Main Model Classes",local:"step-3-implement-main-model-classes",headingTag:"h3"}}),yl=new m({props:{title:"Base Model",local:"base-model",headingTag:"h4"}}),il=new w({props:{code:"Y2xhc3MlMjBZb3VyUHJlVHJhaW5lZE1vZGVsKFByZVRyYWluZWRNb2RlbCUyQyUyME5ldXJvbk1vZGVsTWl4aW4pJTNBJTBBJTIwJTIwJTIwJTIwY29uZmlnX2NsYXNzJTIwJTNEJTIwWW91ck1vZGVsQ29uZmlnJTBBJTIwJTIwJTIwJTIwYmFzZV9tb2RlbF9wcmVmaXglMjAlM0QlMjAlMjJtb2RlbCUyMiUwQSUyMCUyMCUyMCUyMHN1cHBvcnRzX2dyYWRpZW50X2NoZWNrcG9pbnRpbmclMjAlM0QlMjBUcnVlJTBBJTIwJTIwJTIwJTIwX25vX3NwbGl0X21vZHVsZXMlMjAlM0QlMjAlNUIlMjJZb3VyTW9kZWxEZWNvZGVyTGF5ZXIlMjIlNUQlMEElMjAlMjAlMjAlMjBfc2tpcF9rZXlzX2RldmljZV9wbGFjZW1lbnQlMjAlM0QlMjAlMjJwYXN0X2tleV92YWx1ZXMlMjIlMEElMjAlMjAlMjAlMjBfc3VwcG9ydHNfZmxhc2hfYXR0bl8yJTIwJTNEJTIwVHJ1ZSUwQSUyMCUyMCUyMCUyMF9zdXBwb3J0c19jYWNoZV9jbGFzcyUyMCUzRCUyMFRydWUlMEElMjAlMjAlMjAlMjBfc3VwcG9ydHNfcXVhbnRpemVkX2NhY2hlJTIwJTNEJTIwVHJ1ZSUwQSUyMCUyMCUyMCUyMF9zdXBwb3J0c19zdGF0aWNfY2FjaGUlMjAlM0QlMjBUcnVlJTBBJTBBJTBBY2xhc3MlMjBZb3VyTW9kZWwoTmV1cm9uTW9kZWxNaXhpbiUyQyUyMFlvdXJQcmVUcmFpbmVkTW9kZWwpJTNBJTBBJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiUyQyUyMGNvbmZpZyUzQSUyMFlvdXJNb2RlbENvbmZpZyUyQyUyMHRybl9jb25maWclM0ElMjBUcmFpbmluZ05ldXJvbkNvbmZpZyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBZb3VyUHJlVHJhaW5lZE1vZGVsLl9faW5pdF9fKHNlbGYlMkMlMjBjb25maWcpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5wYWRkaW5nX2lkeCUyMCUzRCUyMGNvbmZpZy5wYWRfdG9rZW5faWQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLnZvY2FiX3NpemUlMjAlM0QlMjBjb25maWcudm9jYWJfc2l6ZSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYudHJuX2NvbmZpZyUyMCUzRCUyMHRybl9jb25maWclMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmVtYmVkX3Rva2VucyUyMCUzRCUyMFBhcmFsbGVsRW1iZWRkaW5nKC4uLiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmxheWVycyUyMCUzRCUyMG5uLk1vZHVsZUxpc3QoJTVCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwWW91ck1vZGVsRGVjb2RlckxheWVyKGNvbmZpZyUyQyUyMHRybl9jb25maWclMkMlMjBsYXllcl9pZHgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwbGF5ZXJfaWR4JTIwaW4lMjByYW5nZShjb25maWcubnVtX2hpZGRlbl9sYXllcnMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYubm9ybSUyMCUzRCUyMFlvdXJNb2RlbFJNU05vcm0oLi4uKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYucG9zdF9pbml0KCk=",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourPreTrainedModel</span>(PreTrainedModel, NeuronModelMixin): | |
| config_class = YourModelConfig | |
| base_model_prefix = <span class="hljs-string">"model"</span> | |
| supports_gradient_checkpointing = <span class="hljs-literal">True</span> | |
| _no_split_modules = [<span class="hljs-string">"YourModelDecoderLayer"</span>] | |
| _skip_keys_device_placement = <span class="hljs-string">"past_key_values"</span> | |
| _supports_flash_attn_2 = <span class="hljs-literal">True</span> | |
| _supports_cache_class = <span class="hljs-literal">True</span> | |
| _supports_quantized_cache = <span class="hljs-literal">True</span> | |
| _supports_static_cache = <span class="hljs-literal">True</span> | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModel</span>(NeuronModelMixin, YourPreTrainedModel): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config: YourModelConfig, trn_config: TrainingNeuronConfig</span>): | |
| YourPreTrainedModel.__init__(self, config) | |
| self.padding_idx = config.pad_token_id | |
| self.vocab_size = config.vocab_size | |
| self.trn_config = trn_config | |
| self.embed_tokens = ParallelEmbedding(...) | |
| self.layers = nn.ModuleList([ | |
| YourModelDecoderLayer(config, trn_config, layer_idx) | |
| <span class="hljs-keyword">for</span> layer_idx <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(config.num_hidden_layers) | |
| ]) | |
| self.norm = YourModelRMSNorm(...) | |
| self.post_init()`,lang:"python",wrap:!1}}),Ul=new m({props:{title:"CausalLM Model",local:"causallm-model",headingTag:"h4"}}),pl=new w({props:{code:"Y2xhc3MlMjBZb3VyTW9kZWxGb3JDYXVzYWxMTShOZXVyb25Nb2RlbE1peGluJTJDJTIwWW91clByZVRyYWluZWRNb2RlbCklM0ElMEElMjAlMjAlMjAlMjBfdGllZF93ZWlnaHRzX2tleXMlMjAlM0QlMjAlNUIlMjJsbV9oZWFkLndlaWdodCUyMiU1RCUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMFBpcGVsaW5lJTIwcGFyYWxsZWxpc20lMjBzdXBwb3J0JTBBJTIwJTIwJTIwJTIwU1VQUE9SVFNfUElQRUxJTkVfUEFSQUxMRUxJU00lMjAlM0QlMjBUcnVlJTBBJTIwJTIwJTIwJTIwUElQRUxJTkVfVFJBTlNGT1JNRVJfTEFZRVJfQ0xTJTIwJTNEJTIwWW91ck1vZGVsRGVjb2RlckxheWVyJTBBJTIwJTIwJTIwJTIwUElQRUxJTkVfSU5QVVRfTkFNRVMlMjAlM0QlMjAlNUIlMjJpbnB1dF9pZHMlMjIlMkMlMjAlMjJhdHRlbnRpb25fbWFzayUyMiU1RCUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBjb25maWclMkMlMjB0cm5fY29uZmlnKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18oY29uZmlnKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYudHJuX2NvbmZpZyUyMCUzRCUyMHRybl9jb25maWclMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLm1vZGVsJTIwJTNEJTIwWW91ck1vZGVsKGNvbmZpZyUyQyUyMHRybl9jb25maWcpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi52b2NhYl9zaXplJTIwJTNEJTIwY29uZmlnLnZvY2FiX3NpemUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmxtX2hlYWQlMjAlM0QlMjBDb2x1bW5QYXJhbGxlbExpbmVhciglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb25maWcuaGlkZGVuX3NpemUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjb25maWcudm9jYWJfc2l6ZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJpYXMlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdhdGhlcl9vdXRwdXQlM0RGYWxzZSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTNEY29uZmlnLmR0eXBlJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYucG9zdF9pbml0KCk=",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">YourModelForCausalLM</span>(NeuronModelMixin, YourPreTrainedModel): | |
| _tied_weights_keys = [<span class="hljs-string">"lm_head.weight"</span>] | |
| <span class="hljs-comment"># Pipeline parallelism support</span> | |
| SUPPORTS_PIPELINE_PARALLELISM = <span class="hljs-literal">True</span> | |
| PIPELINE_TRANSFORMER_LAYER_CLS = YourModelDecoderLayer | |
| PIPELINE_INPUT_NAMES = [<span class="hljs-string">"input_ids"</span>, <span class="hljs-string">"attention_mask"</span>] | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, config, trn_config</span>): | |
| <span class="hljs-built_in">super</span>().__init__(config) | |
| self.trn_config = trn_config | |
| self.model = YourModel(config, trn_config) | |
| self.vocab_size = config.vocab_size | |
| self.lm_head = ColumnParallelLinear( | |
| config.hidden_size, | |
| config.vocab_size, | |
| bias=<span class="hljs-literal">False</span>, | |
| gather_output=<span class="hljs-literal">False</span>, | |
| dtype=config.dtype, | |
| ) | |
| self.post_init()`,lang:"python",wrap:!1}}),Tl=new m({props:{title:"Step 4: Register Model",local:"step-4-register-model",headingTag:"h3"}}),Jl=new w({props:{code:"ZnJvbSUyMC55b3VyX21vZGVsJTIwaW1wb3J0JTIwWW91ck1vZGVsRm9yQ2F1c2FsTE0lMkMlMjBZb3VyTW9kZWwlMEElMEFfX2FsbF9fJTIwJTNEJTIwJTVCLi4uJTJDJTIwJTIyWW91ck1vZGVsRm9yQ2F1c2FsTE0lMjIlMkMlMjAlMjJZb3VyTW9kZWwlMjIlNUQ=",highlighted:`<span class="hljs-keyword">from</span> .your_model <span class="hljs-keyword">import</span> YourModelForCausalLM, YourModel | |
| __all__ = [..., <span class="hljs-string">"YourModelForCausalLM"</span>, <span class="hljs-string">"YourModel"</span>]`,lang:"python",wrap:!1}}),ml=new w({props:{code:"ZnJvbSUyMC55b3VyX21vZGVsLm1vZGVsaW5nX3lvdXJfbW9kZWwlMjBpbXBvcnQlMjBZb3VyTW9kZWxGb3JDYXVzYWxMTSUyQyUyMFlvdXJNb2RlbCUwQSUwQSUyMyUyMFJlZ2lzdGVyJTIwdGhlJTIwYmFzZSUyMG1vZGVsJTIwKHdpdGhvdXQlMjBoZWFkKSUwQXJlZ2lzdGVyX25ldXJvbl9tb2RlbF9mb3JfdHJhaW5pbmcoJTIyeW91cl9tb2RlbCUyMiUyQyUyMCUyMm1vZGVsJTIyKShZb3VyTW9kZWwpJTBBJTBBJTIzJTIwUmVnaXN0ZXIlMjB0aGUlMjBDYXVzYWxMTSUyMG1vZGVsJTBBcmVnaXN0ZXJfbmV1cm9uX21vZGVsX2Zvcl90cmFpbmluZyglMjJ5b3VyX21vZGVsJTIyJTJDJTIwJTIydGV4dC1nZW5lcmF0aW9uJTIyKShZb3VyTW9kZWxGb3JDYXVzYWxMTSk=",highlighted:`<span class="hljs-keyword">from</span> .your_model.modeling_your_model <span class="hljs-keyword">import</span> YourModelForCausalLM, YourModel | |
| <span class="hljs-comment"># Register the base model (without head)</span> | |
| register_neuron_model_for_training(<span class="hljs-string">"your_model"</span>, <span class="hljs-string">"model"</span>)(YourModel) | |
| <span class="hljs-comment"># Register the CausalLM model</span> | |
| register_neuron_model_for_training(<span class="hljs-string">"your_model"</span>, <span class="hljs-string">"text-generation"</span>)(YourModelForCausalLM)`,lang:"python",wrap:!1}}),rl=new m({props:{title:"Best Practices",local:"best-practices",headingTag:"h2"}}),jl=new m({props:{title:"1. Parallel Layer Configuration",local:"1-parallel-layer-configuration",headingTag:"h3"}}),ul=new m({props:{title:"2. Weight Transformation Specs",local:"2-weight-transformation-specs",headingTag:"h3"}}),Il=new m({props:{title:"3. Pipeline Parallelism",local:"3-pipeline-parallelism",headingTag:"h3"}}),Al=new m({props:{title:"4. Flash Attention Support",local:"4-flash-attention-support",headingTag:"h3"}}),bl=new m({props:{title:"Testing Your Implementation",local:"testing-your-implementation",headingTag:"h2"}}),_l=new m({props:{title:"1. Custom Modeling Validation",local:"1-custom-modeling-validation",headingTag:"h3"}}),Vl=new w({props:{code:"Q1VTVE9NX01PREVMSU5HU19UT19URVNUJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIzJTIwLi4uJTIwZXhpc3RpbmclMjBtb2RlbHMlMjAuLi4lMEElMjAlMjAlMjAlMjAoJTIyWW91ck1vZGVsRm9yQ2F1c2FsTE0lMjIlMkMlMjAlMjJ5b3VyLW9yZyUyRnlvdXItbW9kZWwtbmFtZSUyMiklMkMlMEElNUQ=",highlighted:`CUSTOM_MODELINGS_TO_TEST = [ | |
| <span class="hljs-comment"># ... existing models ...</span> | |
| (<span class="hljs-string">"YourModelForCausalLM"</span>, <span class="hljs-string">"your-org/your-model-name"</span>), | |
| ]`,lang:"python",wrap:!1}}),$l=new w({props:{code:"ZGVmJTIwdGVzdF9jdXN0b21fbW9kZWxpbmdfbWF0Y2hlc19vcmlnaW5hbCgpJTIwJTIwJTIzJTIwT3V0cHV0JTIwbWF0Y2hpbmc=",highlighted:'<span class="hljs-keyword">def</span> <span class="hljs-title function_">test_custom_modeling_matches_original</span>() <span class="hljs-comment"># Output matching</span>',lang:"python",wrap:!1}}),Ql=new m({props:{title:"2. End-to-End Training Validation",local:"2-end-to-end-training-validation",headingTag:"h3"}}),Nl=new w({props:{code:"JTQwcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoJTBBJTIwJTIwJTIwJTIwJTIybW9kZWxfY2xhc3NfbmFtZSUyQ21vZGVsX25hbWVfb3JfcGF0aCUyQ2xlYXJuaW5nX3JhdGUlMkN3YXJtdXBfcmF0aW8lMkN0cmFpbmluZ19rd2FyZ3MlMkN1c2VfZmxhc2hfYXR0ZW50aW9uXzIlMkNtYXhfZXhwZWN0ZWRfbG9zcyUyQ21heF9sZW5ndGglMkNudW1fc3RlcHMlMjIlMkMlMEElMjAlMjAlMjAlMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAuLi4lMjBleGlzdGluZyUyMG1vZGVscyUyMC4uLiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMllvdXJNb2RlbEZvckNhdXNhbExNJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyeW91ci1vcmclMkZ5b3VyLW1vZGVsLW5hbWUlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxZS00JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMC4wMyUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiU3RCUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFRydWUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAwLjUlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAyMDQ4JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNTAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQlMkMlMEElMjAlMjAlMjAlMjAlNUQlMkMlMEElMjAlMjAlMjAlMjBpZHMlM0QlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAuLi4lMjBleGlzdGluZyUyMG1vZGVsJTIwSURzJTIwLi4uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyeW91ci1vcmclMkZ5b3VyLW1vZGVsLW5hbWUlMjIlMkMlMEElMjAlMjAlMjAlMjAlNUQlMkMlMEEp",highlighted:`<span class="hljs-meta">@pytest.mark.parametrize(<span class="hljs-params"> | |
| <span class="hljs-string">"model_class_name,model_name_or_path,learning_rate,warmup_ratio,training_kwargs,use_flash_attention_2,max_expected_loss,max_length,num_steps"</span>, | |
| [ | |
| <span class="hljs-comment"># ... existing models ...</span> | |
| [ | |
| <span class="hljs-string">"YourModelForCausalLM"</span>, | |
| <span class="hljs-string">"your-org/your-model-name"</span>, | |
| <span class="hljs-number">1e-4</span>, | |
| <span class="hljs-number">0.03</span>, | |
| {}, | |
| <span class="hljs-literal">True</span>, | |
| <span class="hljs-number">0.5</span>, | |
| <span class="hljs-number">2048</span>, | |
| <span class="hljs-number">50</span>, | |
| ], | |
| ], | |
| ids=[ | |
| <span class="hljs-comment"># ... existing model IDs ...</span> | |
| <span class="hljs-string">"your-org/your-model-name"</span>, | |
| ], | |
| </span>)</span>`,lang:"python",wrap:!1}}),Sl=new w({props:{code:"ZGVmJTIwdGVzdF9vdmVyZml0X2N1c3RvbV9tb2RlbGluZ19jYXVzYWxfbG0oKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEJhc2ljJTIwdHJhaW5pbmclMjAoeW91ciUyMG1vZGVsJTIwaW5jbHVkZWQp",highlighted:'<span class="hljs-keyword">def</span> <span class="hljs-title function_">test_overfit_custom_modeling_causal_lm</span>() <span class="hljs-comment"># Basic training (your model included)</span>',lang:"python",wrap:!1}}),Ll=new m({props:{title:"3. Auto Model Loading",local:"3-auto-model-loading",headingTag:"h3"}}),Pl=new w({props:{code:"JTQwcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoJTIyZnJvbV9wcmV0cmFpbmVkJTIyJTJDJTIwJTVCRmFsc2UlMkMlMjBUcnVlJTVEJTJDJTIwaWRzJTNEJTVCJTIyZnJvbV9jb25maWclMjIlMkMlMjAlMjJmcm9tX3ByZXRyYWluZWQlMjIlNUQpJTBBJTQwZGlzdHJpYnV0ZWRfdGVzdCh3b3JsZF9zaXplJTNEMSklMEElNDBpc190cmFpbml1bV90ZXN0JTBBZGVmJTIwdGVzdF9hdXRvX21vZGVsX3dpdGhfc3VwcG9ydGVkX2FyY2hpdGVjdHVyZShmcm9tX3ByZXRyYWluZWQpJTNBJTBBJTIwJTIwJTIwJTIwdHJuX2NvbmZpZyUyMCUzRCUyMFRyYWluaW5nTmV1cm9uQ29uZmlnKCklMEElMjAlMjAlMjAlMjBrd2FyZ3MlMjAlM0QlMjAlN0IlMjJkdHlwZSUyMiUzQSUyMHRvcmNoLmJmbG9hdDE2JTdEJTBBJTIwJTIwJTIwJTIwZm9yJTIwbW9kZWxfbmFtZV9vcl9wYXRoJTIwaW4lMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJtaWNoYWVsYmVuYXlvdW4lMkZsbGFtYS0yLXRpbnktNGt2LWhlYWRzLTRsYXllcnMtcmFuZG9tJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIybWljaGFlbGJlbmF5b3VuJTJGZ3Jhbml0ZS10aW55LTRrdi1oZWFkcy00bGF5ZXJzLXJhbmRvbSUyMiUyQyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pY2hhZWxiZW5heW91biUyRnF3ZW4zLXRpbnktNGt2LWhlYWRzLTRsYXllcnMtcmFuZG9tJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyeW91ci1vcmclMkZ5b3VyLW1vZGVsLW5hbWUlMjIlMkMlMjAlMjAlMjMlMjBBZGQlMjB5b3VyJTIwbW9kZWwlMjBoZXJlJTBBJTIwJTIwJTIwJTIwJTVEJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwLi4uJTIwcmVzdCUyMG9mJTIwdGVzdCUyMGxvZ2ljJTBBJTBBJTQwcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoJTIyZnJvbV9wcmV0cmFpbmVkJTIyJTJDJTIwJTVCRmFsc2UlMkMlMjBUcnVlJTVEJTJDJTIwaWRzJTNEJTVCJTIyZnJvbV9jb25maWclMjIlMkMlMjAlMjJmcm9tX3ByZXRyYWluZWQlMjIlNUQpJTBBJTQwZGlzdHJpYnV0ZWRfdGVzdCh3b3JsZF9zaXplJTNEMSklMEElNDBpc190cmFpbml1bV90ZXN0JTBBZGVmJTIwdGVzdF9hdXRvX21vZGVsX2Zvcl9jYXVzYWxfbG1fd2l0aF9zdXBwb3J0ZWRfYXJjaGl0ZWN0dXJlKGZyb21fcHJldHJhaW5lZCklM0ElMEElMjAlMjAlMjAlMjB0cm5fY29uZmlnJTIwJTNEJTIwVHJhaW5pbmdOZXVyb25Db25maWcoKSUwQSUyMCUyMCUyMCUyMGt3YXJncyUyMCUzRCUyMCU3QiUyMmR0eXBlJTIyJTNBJTIwdG9yY2guYmZsb2F0MTYlN0QlMEElMjAlMjAlMjAlMjBmb3IlMjBtb2RlbF9uYW1lX29yX3BhdGglMjBpbiUyMCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pY2hhZWxiZW5heW91biUyRmxsYW1hLTItdGlueS00a3YtaGVhZHMtNGxheWVycy1yYW5kb20lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJtaWNoYWVsYmVuYXlvdW4lMkZncmFuaXRlLXRpbnktNGt2LWhlYWRzLTRsYXllcnMtcmFuZG9tJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIybWljaGFlbGJlbmF5b3VuJTJGcXdlbjMtdGlueS00a3YtaGVhZHMtNGxheWVycy1yYW5kb20lMjIlMkMlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ5b3VyLW9yZyUyRnlvdXItbW9kZWwtbmFtZSUyMiUyQyUyMCUyMCUyMyUyMEFkZCUyMHlvdXIlMjBtb2RlbCUyMGhlcmUlMEElMjAlMjAlMjAlMjAlNUQlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAuLi4lMjByZXN0JTIwb2YlMjB0ZXN0JTIwbG9naWM=",highlighted:`<span class="hljs-meta">@pytest.mark.parametrize(<span class="hljs-params"><span class="hljs-string">"from_pretrained"</span>, [<span class="hljs-literal">False</span>, <span class="hljs-literal">True</span>], ids=[<span class="hljs-string">"from_config"</span>, <span class="hljs-string">"from_pretrained"</span>]</span>)</span> | |
| <span class="hljs-meta">@distributed_test(<span class="hljs-params">world_size=<span class="hljs-number">1</span></span>)</span> | |
| <span class="hljs-meta">@is_trainium_test</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">test_auto_model_with_supported_architecture</span>(<span class="hljs-params">from_pretrained</span>): | |
| trn_config = TrainingNeuronConfig() | |
| kwargs = {<span class="hljs-string">"dtype"</span>: torch.bfloat16} | |
| <span class="hljs-keyword">for</span> model_name_or_path <span class="hljs-keyword">in</span> [ | |
| <span class="hljs-string">"michaelbenayoun/llama-2-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"michaelbenayoun/granite-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"michaelbenayoun/qwen3-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"your-org/your-model-name"</span>, <span class="hljs-comment"># Add your model here</span> | |
| ]: | |
| <span class="hljs-comment"># ... rest of test logic</span> | |
| <span class="hljs-meta">@pytest.mark.parametrize(<span class="hljs-params"><span class="hljs-string">"from_pretrained"</span>, [<span class="hljs-literal">False</span>, <span class="hljs-literal">True</span>], ids=[<span class="hljs-string">"from_config"</span>, <span class="hljs-string">"from_pretrained"</span>]</span>)</span> | |
| <span class="hljs-meta">@distributed_test(<span class="hljs-params">world_size=<span class="hljs-number">1</span></span>)</span> | |
| <span class="hljs-meta">@is_trainium_test</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">test_auto_model_for_causal_lm_with_supported_architecture</span>(<span class="hljs-params">from_pretrained</span>): | |
| trn_config = TrainingNeuronConfig() | |
| kwargs = {<span class="hljs-string">"dtype"</span>: torch.bfloat16} | |
| <span class="hljs-keyword">for</span> model_name_or_path <span class="hljs-keyword">in</span> [ | |
| <span class="hljs-string">"michaelbenayoun/llama-2-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"michaelbenayoun/granite-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"michaelbenayoun/qwen3-tiny-4kv-heads-4layers-random"</span>, | |
| <span class="hljs-string">"your-org/your-model-name"</span>, <span class="hljs-comment"># Add your model here</span> | |
| ]: | |
| <span class="hljs-comment"># ... rest of test logic</span>`,lang:"python",wrap:!1}}),Ol=new m({props:{title:"4. Running Tests",local:"4-running-tests",headingTag:"h3"}}),ee=new w({props:{code:"JTIzJTIwUnVuJTIwYWxsJTIwY3VzdG9tJTIwbW9kZWxpbmclMjB0ZXN0cyUwQXB5dGVzdCUyMHRlc3RzJTJGdHJhaW5pbmclMkZ0ZXN0X2N1c3RvbV9tb2RlbGluZy5weSUyMC12JTBBJTBBJTIzJTIwUnVuJTIwc3BlY2lmaWMlMjBtb2RlbCUyMHRlc3RzJTBBcHl0ZXN0JTIwdGVzdHMlMkZ0cmFpbmluZyUyRnRlc3RfY3VzdG9tX21vZGVsaW5nLnB5JTIwLXYlMjAtayUyMCUyMnlvdXJfbW9kZWwlMjIlMEElMEElMjMlMjBSdW4lMjBlbmQtdG8tZW5kJTIwdHJhaW5pbmclMjB2YWxpZGF0aW9uJTBBcHl0ZXN0JTIwdGVzdHMlMkZ0cmFpbmluZyUyRnRlc3Rfb3ZlcmZpdC5weSUyMC12",highlighted:`<span class="hljs-comment"># Run all custom modeling tests</span> | |
| pytest tests/training/test_custom_modeling.py -v | |
| <span class="hljs-comment"># Run specific model tests</span> | |
| pytest tests/training/test_custom_modeling.py -v -k <span class="hljs-string">"your_model"</span> | |
| <span class="hljs-comment"># Run end-to-end training validation</span> | |
| pytest tests/training/test_overfit.py -v`,lang:"bash",wrap:!1}}),Me=new m({props:{title:"5. Test Requirements",local:"5-test-requirements",headingTag:"h3"}}),ae=new m({props:{title:"Common Issues",local:"common-issues",headingTag:"h2"}}),ie=new m({props:{title:"Additional Resources",local:"additional-resources",headingTag:"h2"}}),{c(){r=a("meta"),me=t(),Je=a("p"),we=t(),U(j.$$.fragment),re=t(),U(d.$$.fragment),je=t(),u=a("p"),u.innerHTML=Cs,de=t(),U(c.$$.fragment),ue=t(),U(I.$$.fragment),ce=t(),f=a("p"),f.innerHTML=ms,Ie=t(),A=a("ul"),A.innerHTML=ws,fe=t(),U(h.$$.fragment),Ae=t(),b=a("p"),b.textContent=rs,he=t(),Z=a("ul"),Z.innerHTML=js,be=t(),_=a("p"),_.textContent=ds,Ze=t(),W=a("ul"),W.innerHTML=us,_e=t(),g=a("p"),g.innerHTML=cs,We=t(),U(V.$$.fragment),ge=t(),B=a("p"),B.innerHTML=Is,Ve=t(),k=a("ul"),k.innerHTML=fs,Be=t(),U(G.$$.fragment),ke=t(),U(X.$$.fragment),Ge=t(),v=a("p"),v.innerHTML=As,Xe=t(),$=a("p"),$.innerHTML=hs,ve=t(),U(R.$$.fragment),$e=t(),U(Q.$$.fragment),Re=t(),Y=a("p"),Y.innerHTML=bs,Qe=t(),U(F.$$.fragment),Ye=t(),U(N.$$.fragment),Fe=t(),U(x.$$.fragment),Ne=t(),U(z.$$.fragment),xe=t(),U(E.$$.fragment),ze=t(),S=a("p"),S.innerHTML=Zs,Ee=t(),U(L.$$.fragment),Se=t(),U(H.$$.fragment),Le=t(),q=a("p"),q.textContent=_s,He=t(),P=a("p"),P.innerHTML=Ws,qe=t(),U(K.$$.fragment),Pe=t(),D=a("p"),D.innerHTML=gs,Ke=t(),U(O.$$.fragment),De=t(),ll=a("p"),ll.innerHTML=Vs,Oe=t(),U(el.$$.fragment),lM=t(),Ml=a("p"),Ml.innerHTML=Bs,eM=t(),sl=a("ul"),sl.innerHTML=ks,MM=t(),tl=a("p"),tl.textContent=Gs,sM=t(),U(nl.$$.fragment),tM=t(),U(al.$$.fragment),nM=t(),U(yl.$$.fragment),aM=t(),U(il.$$.fragment),yM=t(),U(Ul.$$.fragment),iM=t(),U(pl.$$.fragment),UM=t(),U(Tl.$$.fragment),pM=t(),ol=a("p"),ol.innerHTML=Xs,TM=t(),U(Jl.$$.fragment),oM=t(),Cl=a("p"),Cl.innerHTML=vs,JM=t(),U(ml.$$.fragment),CM=t(),wl=a("p"),wl.innerHTML=$s,mM=t(),U(rl.$$.fragment),wM=t(),U(jl.$$.fragment),rM=t(),dl=a("ul"),dl.innerHTML=Rs,jM=t(),U(ul.$$.fragment),dM=t(),cl=a("ul"),cl.innerHTML=Qs,uM=t(),U(Il.$$.fragment),cM=t(),fl=a("ul"),fl.innerHTML=Ys,IM=t(),U(Al.$$.fragment),fM=t(),hl=a("ul"),hl.innerHTML=Fs,AM=t(),U(bl.$$.fragment),hM=t(),Zl=a("p"),Zl.innerHTML=Ns,bM=t(),U(_l.$$.fragment),ZM=t(),Wl=a("p"),Wl.innerHTML=xs,_M=t(),gl=a("p"),gl.innerHTML=zs,WM=t(),U(Vl.$$.fragment),gM=t(),Bl=a("p"),Bl.innerHTML=Es,VM=t(),kl=a("ul"),kl.innerHTML=Ss,BM=t(),Gl=a("p"),Gl.textContent=Ls,kM=t(),Xl=a("ul"),Xl.innerHTML=Hs,GM=t(),vl=a("p"),vl.textContent=qs,XM=t(),U($l.$$.fragment),vM=t(),Rl=a("ul"),Rl.innerHTML=Ps,$M=t(),U(Ql.$$.fragment),RM=t(),Yl=a("p"),Yl.innerHTML=Ks,QM=t(),Fl=a("p"),Fl.innerHTML=Ds,YM=t(),U(Nl.$$.fragment),FM=t(),xl=a("p"),xl.textContent=Os,NM=t(),zl=a("ul"),zl.innerHTML=lt,xM=t(),El=a("p"),El.textContent=et,zM=t(),U(Sl.$$.fragment),EM=t(),U(Ll.$$.fragment),SM=t(),Hl=a("p"),Hl.innerHTML=Mt,LM=t(),ql=a("p"),ql.innerHTML=st,HM=t(),U(Pl.$$.fragment),qM=t(),Kl=a("p"),Kl.textContent=tt,PM=t(),Dl=a("ul"),Dl.innerHTML=nt,KM=t(),U(Ol.$$.fragment),DM=t(),le=a("p"),le.textContent=at,OM=t(),U(ee.$$.fragment),ls=t(),U(Me.$$.fragment),es=t(),se=a("p"),se.textContent=yt,Ms=t(),te=a("ol"),te.innerHTML=it,ss=t(),ne=a("p"),ne.textContent=Ut,ts=t(),U(ae.$$.fragment),ns=t(),ye=a("ul"),ye.innerHTML=pt,as=t(),U(ie.$$.fragment),ys=t(),Ue=a("p"),Ue.textContent=Tt,is=t(),pe=a("ul"),pe.innerHTML=ot,Us=t(),Te=a("p"),Te.textContent=Jt,ps=t(),oe=a("ul"),oe.innerHTML=Ct,Ts=t(),Ce=a("p"),this.h()},l(l){const e=It("svelte-u9bgzb",document.head);r=y(e,"META",{name:!0,content:!0}),e.forEach(M),me=n(l),Je=y(l,"P",{}),mt(Je).forEach(M),we=n(l),p(j.$$.fragment,l),re=n(l),p(d.$$.fragment,l),je=n(l),u=y(l,"P",{"data-svelte-h":!0}),i(u)!=="svelte-o1icnh"&&(u.innerHTML=Cs),de=n(l),p(c.$$.fragment,l),ue=n(l),p(I.$$.fragment,l),ce=n(l),f=y(l,"P",{"data-svelte-h":!0}),i(f)!=="svelte-o8lxl9"&&(f.innerHTML=ms),Ie=n(l),A=y(l,"UL",{"data-svelte-h":!0}),i(A)!=="svelte-17o51ne"&&(A.innerHTML=ws),fe=n(l),p(h.$$.fragment,l),Ae=n(l),b=y(l,"P",{"data-svelte-h":!0}),i(b)!=="svelte-1cxti7r"&&(b.textContent=rs),he=n(l),Z=y(l,"UL",{"data-svelte-h":!0}),i(Z)!=="svelte-egt1g"&&(Z.innerHTML=js),be=n(l),_=y(l,"P",{"data-svelte-h":!0}),i(_)!=="svelte-1sw314o"&&(_.textContent=ds),Ze=n(l),W=y(l,"UL",{"data-svelte-h":!0}),i(W)!=="svelte-1813bw9"&&(W.innerHTML=us),_e=n(l),g=y(l,"P",{"data-svelte-h":!0}),i(g)!=="svelte-1xgxhwy"&&(g.innerHTML=cs),We=n(l),p(V.$$.fragment,l),ge=n(l),B=y(l,"P",{"data-svelte-h":!0}),i(B)!=="svelte-1xa5nbr"&&(B.innerHTML=Is),Ve=n(l),k=y(l,"UL",{"data-svelte-h":!0}),i(k)!=="svelte-1p13ho0"&&(k.innerHTML=fs),Be=n(l),p(G.$$.fragment,l),ke=n(l),p(X.$$.fragment,l),Ge=n(l),v=y(l,"P",{"data-svelte-h":!0}),i(v)!=="svelte-1brmy4r"&&(v.innerHTML=As),Xe=n(l),$=y(l,"P",{"data-svelte-h":!0}),i($)!=="svelte-1bum30f"&&($.innerHTML=hs),ve=n(l),p(R.$$.fragment,l),$e=n(l),p(Q.$$.fragment,l),Re=n(l),Y=y(l,"P",{"data-svelte-h":!0}),i(Y)!=="svelte-1a3kcfq"&&(Y.innerHTML=bs),Qe=n(l),p(F.$$.fragment,l),Ye=n(l),p(N.$$.fragment,l),Fe=n(l),p(x.$$.fragment,l),Ne=n(l),p(z.$$.fragment,l),xe=n(l),p(E.$$.fragment,l),ze=n(l),S=y(l,"P",{"data-svelte-h":!0}),i(S)!=="svelte-1kxohx9"&&(S.innerHTML=Zs),Ee=n(l),p(L.$$.fragment,l),Se=n(l),p(H.$$.fragment,l),Le=n(l),q=y(l,"P",{"data-svelte-h":!0}),i(q)!=="svelte-67vg61"&&(q.textContent=_s),He=n(l),P=y(l,"P",{"data-svelte-h":!0}),i(P)!=="svelte-b4subx"&&(P.innerHTML=Ws),qe=n(l),p(K.$$.fragment,l),Pe=n(l),D=y(l,"P",{"data-svelte-h":!0}),i(D)!=="svelte-f9hwk6"&&(D.innerHTML=gs),Ke=n(l),p(O.$$.fragment,l),De=n(l),ll=y(l,"P",{"data-svelte-h":!0}),i(ll)!=="svelte-lyz81m"&&(ll.innerHTML=Vs),Oe=n(l),p(el.$$.fragment,l),lM=n(l),Ml=y(l,"P",{"data-svelte-h":!0}),i(Ml)!=="svelte-163bvl5"&&(Ml.innerHTML=Bs),eM=n(l),sl=y(l,"UL",{"data-svelte-h":!0}),i(sl)!=="svelte-3el8k"&&(sl.innerHTML=ks),MM=n(l),tl=y(l,"P",{"data-svelte-h":!0}),i(tl)!=="svelte-10ra3tv"&&(tl.textContent=Gs),sM=n(l),p(nl.$$.fragment,l),tM=n(l),p(al.$$.fragment,l),nM=n(l),p(yl.$$.fragment,l),aM=n(l),p(il.$$.fragment,l),yM=n(l),p(Ul.$$.fragment,l),iM=n(l),p(pl.$$.fragment,l),UM=n(l),p(Tl.$$.fragment,l),pM=n(l),ol=y(l,"P",{"data-svelte-h":!0}),i(ol)!=="svelte-1r6d489"&&(ol.innerHTML=Xs),TM=n(l),p(Jl.$$.fragment,l),oM=n(l),Cl=y(l,"P",{"data-svelte-h":!0}),i(Cl)!=="svelte-hs3no7"&&(Cl.innerHTML=vs),JM=n(l),p(ml.$$.fragment,l),CM=n(l),wl=y(l,"P",{"data-svelte-h":!0}),i(wl)!=="svelte-12q3gxe"&&(wl.innerHTML=$s),mM=n(l),p(rl.$$.fragment,l),wM=n(l),p(jl.$$.fragment,l),rM=n(l),dl=y(l,"UL",{"data-svelte-h":!0}),i(dl)!=="svelte-n3fz09"&&(dl.innerHTML=Rs),jM=n(l),p(ul.$$.fragment,l),dM=n(l),cl=y(l,"UL",{"data-svelte-h":!0}),i(cl)!=="svelte-zppzms"&&(cl.innerHTML=Qs),uM=n(l),p(Il.$$.fragment,l),cM=n(l),fl=y(l,"UL",{"data-svelte-h":!0}),i(fl)!=="svelte-h3sif8"&&(fl.innerHTML=Ys),IM=n(l),p(Al.$$.fragment,l),fM=n(l),hl=y(l,"UL",{"data-svelte-h":!0}),i(hl)!=="svelte-18wpz97"&&(hl.innerHTML=Fs),AM=n(l),p(bl.$$.fragment,l),hM=n(l),Zl=y(l,"P",{"data-svelte-h":!0}),i(Zl)!=="svelte-1gtlfnj"&&(Zl.innerHTML=Ns),bM=n(l),p(_l.$$.fragment,l),ZM=n(l),Wl=y(l,"P",{"data-svelte-h":!0}),i(Wl)!=="svelte-oqrl65"&&(Wl.innerHTML=xs),_M=n(l),gl=y(l,"P",{"data-svelte-h":!0}),i(gl)!=="svelte-f0o4jc"&&(gl.innerHTML=zs),WM=n(l),p(Vl.$$.fragment,l),gM=n(l),Bl=y(l,"P",{"data-svelte-h":!0}),i(Bl)!=="svelte-cj2f57"&&(Bl.innerHTML=Es),VM=n(l),kl=y(l,"UL",{"data-svelte-h":!0}),i(kl)!=="svelte-is5pbj"&&(kl.innerHTML=Ss),BM=n(l),Gl=y(l,"P",{"data-svelte-h":!0}),i(Gl)!=="svelte-1p913uj"&&(Gl.textContent=Ls),kM=n(l),Xl=y(l,"UL",{"data-svelte-h":!0}),i(Xl)!=="svelte-13v9552"&&(Xl.innerHTML=Hs),GM=n(l),vl=y(l,"P",{"data-svelte-h":!0}),i(vl)!=="svelte-1psu9rx"&&(vl.textContent=qs),XM=n(l),p($l.$$.fragment,l),vM=n(l),Rl=y(l,"UL",{"data-svelte-h":!0}),i(Rl)!=="svelte-grvokw"&&(Rl.innerHTML=Ps),$M=n(l),p(Ql.$$.fragment,l),RM=n(l),Yl=y(l,"P",{"data-svelte-h":!0}),i(Yl)!=="svelte-1xgz07a"&&(Yl.innerHTML=Ks),QM=n(l),Fl=y(l,"P",{"data-svelte-h":!0}),i(Fl)!=="svelte-skk8sm"&&(Fl.innerHTML=Ds),YM=n(l),p(Nl.$$.fragment,l),FM=n(l),xl=y(l,"P",{"data-svelte-h":!0}),i(xl)!=="svelte-1c9b85z"&&(xl.textContent=Os),NM=n(l),zl=y(l,"UL",{"data-svelte-h":!0}),i(zl)!=="svelte-15o1gbp"&&(zl.innerHTML=lt),xM=n(l),El=y(l,"P",{"data-svelte-h":!0}),i(El)!=="svelte-1l6upaz"&&(El.textContent=et),zM=n(l),p(Sl.$$.fragment,l),EM=n(l),p(Ll.$$.fragment,l),SM=n(l),Hl=y(l,"P",{"data-svelte-h":!0}),i(Hl)!=="svelte-1p3hpdo"&&(Hl.innerHTML=Mt),LM=n(l),ql=y(l,"P",{"data-svelte-h":!0}),i(ql)!=="svelte-i621bo"&&(ql.innerHTML=st),HM=n(l),p(Pl.$$.fragment,l),qM=n(l),Kl=y(l,"P",{"data-svelte-h":!0}),i(Kl)!=="svelte-1c9b85z"&&(Kl.textContent=tt),PM=n(l),Dl=y(l,"UL",{"data-svelte-h":!0}),i(Dl)!=="svelte-1pogip"&&(Dl.innerHTML=nt),KM=n(l),p(Ol.$$.fragment,l),DM=n(l),le=y(l,"P",{"data-svelte-h":!0}),i(le)!=="svelte-6i8ef"&&(le.textContent=at),OM=n(l),p(ee.$$.fragment,l),ls=n(l),p(Me.$$.fragment,l),es=n(l),se=y(l,"P",{"data-svelte-h":!0}),i(se)!=="svelte-1lc4hka"&&(se.textContent=yt),Ms=n(l),te=y(l,"OL",{"data-svelte-h":!0}),i(te)!=="svelte-12pvc9t"&&(te.innerHTML=it),ss=n(l),ne=y(l,"P",{"data-svelte-h":!0}),i(ne)!=="svelte-ixzgc9"&&(ne.textContent=Ut),ts=n(l),p(ae.$$.fragment,l),ns=n(l),ye=y(l,"UL",{"data-svelte-h":!0}),i(ye)!=="svelte-1g0k1y8"&&(ye.innerHTML=pt),as=n(l),p(ie.$$.fragment,l),ys=n(l),Ue=y(l,"P",{"data-svelte-h":!0}),i(Ue)!=="svelte-1brs14g"&&(Ue.textContent=Tt),is=n(l),pe=y(l,"UL",{"data-svelte-h":!0}),i(pe)!=="svelte-1ep1va0"&&(pe.innerHTML=ot),Us=n(l),Te=y(l,"P",{"data-svelte-h":!0}),i(Te)!=="svelte-1q4t712"&&(Te.textContent=Jt),ps=n(l),oe=y(l,"UL",{"data-svelte-h":!0}),i(oe)!=="svelte-jpnk8d"&&(oe.innerHTML=Ct),Ts=n(l),Ce=y(l,"P",{}),mt(Ce).forEach(M),this.h()},h(){wt(r,"name","hf:doc:metadata"),wt(r,"content",bt)},m(l,e){ft(document.head,r),s(l,me,e),s(l,Je,e),s(l,we,e),T(j,l,e),s(l,re,e),T(d,l,e),s(l,je,e),s(l,u,e),s(l,de,e),T(c,l,e),s(l,ue,e),T(I,l,e),s(l,ce,e),s(l,f,e),s(l,Ie,e),s(l,A,e),s(l,fe,e),T(h,l,e),s(l,Ae,e),s(l,b,e),s(l,he,e),s(l,Z,e),s(l,be,e),s(l,_,e),s(l,Ze,e),s(l,W,e),s(l,_e,e),s(l,g,e),s(l,We,e),T(V,l,e),s(l,ge,e),s(l,B,e),s(l,Ve,e),s(l,k,e),s(l,Be,e),T(G,l,e),s(l,ke,e),T(X,l,e),s(l,Ge,e),s(l,v,e),s(l,Xe,e),s(l,$,e),s(l,ve,e),T(R,l,e),s(l,$e,e),T(Q,l,e),s(l,Re,e),s(l,Y,e),s(l,Qe,e),T(F,l,e),s(l,Ye,e),T(N,l,e),s(l,Fe,e),T(x,l,e),s(l,Ne,e),T(z,l,e),s(l,xe,e),T(E,l,e),s(l,ze,e),s(l,S,e),s(l,Ee,e),T(L,l,e),s(l,Se,e),T(H,l,e),s(l,Le,e),s(l,q,e),s(l,He,e),s(l,P,e),s(l,qe,e),T(K,l,e),s(l,Pe,e),s(l,D,e),s(l,Ke,e),T(O,l,e),s(l,De,e),s(l,ll,e),s(l,Oe,e),T(el,l,e),s(l,lM,e),s(l,Ml,e),s(l,eM,e),s(l,sl,e),s(l,MM,e),s(l,tl,e),s(l,sM,e),T(nl,l,e),s(l,tM,e),T(al,l,e),s(l,nM,e),T(yl,l,e),s(l,aM,e),T(il,l,e),s(l,yM,e),T(Ul,l,e),s(l,iM,e),T(pl,l,e),s(l,UM,e),T(Tl,l,e),s(l,pM,e),s(l,ol,e),s(l,TM,e),T(Jl,l,e),s(l,oM,e),s(l,Cl,e),s(l,JM,e),T(ml,l,e),s(l,CM,e),s(l,wl,e),s(l,mM,e),T(rl,l,e),s(l,wM,e),T(jl,l,e),s(l,rM,e),s(l,dl,e),s(l,jM,e),T(ul,l,e),s(l,dM,e),s(l,cl,e),s(l,uM,e),T(Il,l,e),s(l,cM,e),s(l,fl,e),s(l,IM,e),T(Al,l,e),s(l,fM,e),s(l,hl,e),s(l,AM,e),T(bl,l,e),s(l,hM,e),s(l,Zl,e),s(l,bM,e),T(_l,l,e),s(l,ZM,e),s(l,Wl,e),s(l,_M,e),s(l,gl,e),s(l,WM,e),T(Vl,l,e),s(l,gM,e),s(l,Bl,e),s(l,VM,e),s(l,kl,e),s(l,BM,e),s(l,Gl,e),s(l,kM,e),s(l,Xl,e),s(l,GM,e),s(l,vl,e),s(l,XM,e),T($l,l,e),s(l,vM,e),s(l,Rl,e),s(l,$M,e),T(Ql,l,e),s(l,RM,e),s(l,Yl,e),s(l,QM,e),s(l,Fl,e),s(l,YM,e),T(Nl,l,e),s(l,FM,e),s(l,xl,e),s(l,NM,e),s(l,zl,e),s(l,xM,e),s(l,El,e),s(l,zM,e),T(Sl,l,e),s(l,EM,e),T(Ll,l,e),s(l,SM,e),s(l,Hl,e),s(l,LM,e),s(l,ql,e),s(l,HM,e),T(Pl,l,e),s(l,qM,e),s(l,Kl,e),s(l,PM,e),s(l,Dl,e),s(l,KM,e),T(Ol,l,e),s(l,DM,e),s(l,le,e),s(l,OM,e),T(ee,l,e),s(l,ls,e),T(Me,l,e),s(l,es,e),s(l,se,e),s(l,Ms,e),s(l,te,e),s(l,ss,e),s(l,ne,e),s(l,ts,e),T(ae,l,e),s(l,ns,e),s(l,ye,e),s(l,as,e),T(ie,l,e),s(l,ys,e),s(l,Ue,e),s(l,is,e),s(l,pe,e),s(l,Us,e),s(l,Te,e),s(l,ps,e),s(l,oe,e),s(l,Ts,e),s(l,Ce,e),os=!0},p:jt,i(l){os||(o(j.$$.fragment,l),o(d.$$.fragment,l),o(c.$$.fragment,l),o(I.$$.fragment,l),o(h.$$.fragment,l),o(V.$$.fragment,l),o(G.$$.fragment,l),o(X.$$.fragment,l),o(R.$$.fragment,l),o(Q.$$.fragment,l),o(F.$$.fragment,l),o(N.$$.fragment,l),o(x.$$.fragment,l),o(z.$$.fragment,l),o(E.$$.fragment,l),o(L.$$.fragment,l),o(H.$$.fragment,l),o(K.$$.fragment,l),o(O.$$.fragment,l),o(el.$$.fragment,l),o(nl.$$.fragment,l),o(al.$$.fragment,l),o(yl.$$.fragment,l),o(il.$$.fragment,l),o(Ul.$$.fragment,l),o(pl.$$.fragment,l),o(Tl.$$.fragment,l),o(Jl.$$.fragment,l),o(ml.$$.fragment,l),o(rl.$$.fragment,l),o(jl.$$.fragment,l),o(ul.$$.fragment,l),o(Il.$$.fragment,l),o(Al.$$.fragment,l),o(bl.$$.fragment,l),o(_l.$$.fragment,l),o(Vl.$$.fragment,l),o($l.$$.fragment,l),o(Ql.$$.fragment,l),o(Nl.$$.fragment,l),o(Sl.$$.fragment,l),o(Ll.$$.fragment,l),o(Pl.$$.fragment,l),o(Ol.$$.fragment,l),o(ee.$$.fragment,l),o(Me.$$.fragment,l),o(ae.$$.fragment,l),o(ie.$$.fragment,l),os=!0)},o(l){J(j.$$.fragment,l),J(d.$$.fragment,l),J(c.$$.fragment,l),J(I.$$.fragment,l),J(h.$$.fragment,l),J(V.$$.fragment,l),J(G.$$.fragment,l),J(X.$$.fragment,l),J(R.$$.fragment,l),J(Q.$$.fragment,l),J(F.$$.fragment,l),J(N.$$.fragment,l),J(x.$$.fragment,l),J(z.$$.fragment,l),J(E.$$.fragment,l),J(L.$$.fragment,l),J(H.$$.fragment,l),J(K.$$.fragment,l),J(O.$$.fragment,l),J(el.$$.fragment,l),J(nl.$$.fragment,l),J(al.$$.fragment,l),J(yl.$$.fragment,l),J(il.$$.fragment,l),J(Ul.$$.fragment,l),J(pl.$$.fragment,l),J(Tl.$$.fragment,l),J(Jl.$$.fragment,l),J(ml.$$.fragment,l),J(rl.$$.fragment,l),J(jl.$$.fragment,l),J(ul.$$.fragment,l),J(Il.$$.fragment,l),J(Al.$$.fragment,l),J(bl.$$.fragment,l),J(_l.$$.fragment,l),J(Vl.$$.fragment,l),J($l.$$.fragment,l),J(Ql.$$.fragment,l),J(Nl.$$.fragment,l),J(Sl.$$.fragment,l),J(Ll.$$.fragment,l),J(Pl.$$.fragment,l),J(Ol.$$.fragment,l),J(ee.$$.fragment,l),J(Me.$$.fragment,l),J(ae.$$.fragment,l),J(ie.$$.fragment,l),os=!1},d(l){l&&(M(me),M(Je),M(we),M(re),M(je),M(u),M(de),M(ue),M(ce),M(f),M(Ie),M(A),M(fe),M(Ae),M(b),M(he),M(Z),M(be),M(_),M(Ze),M(W),M(_e),M(g),M(We),M(ge),M(B),M(Ve),M(k),M(Be),M(ke),M(Ge),M(v),M(Xe),M($),M(ve),M($e),M(Re),M(Y),M(Qe),M(Ye),M(Fe),M(Ne),M(xe),M(ze),M(S),M(Ee),M(Se),M(Le),M(q),M(He),M(P),M(qe),M(Pe),M(D),M(Ke),M(De),M(ll),M(Oe),M(lM),M(Ml),M(eM),M(sl),M(MM),M(tl),M(sM),M(tM),M(nM),M(aM),M(yM),M(iM),M(UM),M(pM),M(ol),M(TM),M(oM),M(Cl),M(JM),M(CM),M(wl),M(mM),M(wM),M(rM),M(dl),M(jM),M(dM),M(cl),M(uM),M(cM),M(fl),M(IM),M(fM),M(hl),M(AM),M(hM),M(Zl),M(bM),M(ZM),M(Wl),M(_M),M(gl),M(WM),M(gM),M(Bl),M(VM),M(kl),M(BM),M(Gl),M(kM),M(Xl),M(GM),M(vl),M(XM),M(vM),M(Rl),M($M),M(RM),M(Yl),M(QM),M(Fl),M(YM),M(FM),M(xl),M(NM),M(zl),M(xM),M(El),M(zM),M(EM),M(SM),M(Hl),M(LM),M(ql),M(HM),M(qM),M(Kl),M(PM),M(Dl),M(KM),M(DM),M(le),M(OM),M(ls),M(es),M(se),M(Ms),M(te),M(ss),M(ne),M(ts),M(ns),M(ye),M(as),M(ys),M(Ue),M(is),M(pe),M(Us),M(Te),M(ps),M(oe),M(Ts),M(Ce)),M(r),C(j,l),C(d,l),C(c,l),C(I,l),C(h,l),C(V,l),C(G,l),C(X,l),C(R,l),C(Q,l),C(F,l),C(N,l),C(x,l),C(z,l),C(E,l),C(L,l),C(H,l),C(K,l),C(O,l),C(el,l),C(nl,l),C(al,l),C(yl,l),C(il,l),C(Ul,l),C(pl,l),C(Tl,l),C(Jl,l),C(ml,l),C(rl,l),C(jl,l),C(ul,l),C(Il,l),C(Al,l),C(bl,l),C(_l,l),C(Vl,l),C($l,l),C(Ql,l),C(Nl,l),C(Sl,l),C(Ll,l),C(Pl,l),C(Ol,l),C(ee,l),C(Me,l),C(ae,l),C(ie,l)}}}const bt='{"title":"Contributing Custom Models for Training","local":"contributing-custom-models-for-training","sections":[{"title":"Architecture Components","local":"architecture-components","sections":[{"title":"1. NeuronModelMixin","local":"1-neuronmodelmixin","sections":[],"depth":3},{"title":"2. Weight Transformation Specs","local":"2-weight-transformation-specs","sections":[],"depth":3},{"title":"3. Parallel Layers","local":"3-parallel-layers","sections":[],"depth":3}],"depth":2},{"title":"Implementation Steps","local":"implementation-steps","sections":[{"title":"Step 1: Create Model Structure","local":"step-1-create-model-structure","sections":[],"depth":3},{"title":"Step 2: Implement the Model Building Blocks","local":"step-2-implement-the-model-building-blocks","sections":[{"title":"Imports and Dependencies","local":"imports-and-dependencies","sections":[],"depth":4},{"title":"Embedding Layer","local":"embedding-layer","sections":[],"depth":4},{"title":"MLP Layer with Fused Linears","local":"mlp-layer-with-fused-linears","sections":[],"depth":4},{"title":"Attention Layer","local":"attention-layer","sections":[],"depth":4}],"depth":3},{"title":"Step 3: Implement Main Model Classes","local":"step-3-implement-main-model-classes","sections":[{"title":"Base Model","local":"base-model","sections":[],"depth":4},{"title":"CausalLM Model","local":"causallm-model","sections":[],"depth":4}],"depth":3},{"title":"Step 4: Register Model","local":"step-4-register-model","sections":[],"depth":3}],"depth":2},{"title":"Best Practices","local":"best-practices","sections":[{"title":"1. Parallel Layer Configuration","local":"1-parallel-layer-configuration","sections":[],"depth":3},{"title":"2. Weight Transformation Specs","local":"2-weight-transformation-specs","sections":[],"depth":3},{"title":"3. Pipeline Parallelism","local":"3-pipeline-parallelism","sections":[],"depth":3},{"title":"4. Flash Attention Support","local":"4-flash-attention-support","sections":[],"depth":3}],"depth":2},{"title":"Testing Your Implementation","local":"testing-your-implementation","sections":[{"title":"1. Custom Modeling Validation","local":"1-custom-modeling-validation","sections":[],"depth":3},{"title":"2. End-to-End Training Validation","local":"2-end-to-end-training-validation","sections":[],"depth":3},{"title":"3. Auto Model Loading","local":"3-auto-model-loading","sections":[],"depth":3},{"title":"4. Running Tests","local":"4-running-tests","sections":[],"depth":3},{"title":"5. Test Requirements","local":"5-test-requirements","sections":[],"depth":3}],"depth":2},{"title":"Common Issues","local":"common-issues","sections":[],"depth":2},{"title":"Additional Resources","local":"additional-resources","sections":[],"depth":2}],"depth":1}';function Zt(Js){return dt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class kt extends ut{constructor(r){super(),ct(this,r,Zt,ht,rt,{})}}export{kt as component}; | |
Xet Storage Details
- Size:
- 80.7 kB
- Xet hash:
- 267b8a7beb879c02030ac741ac10f1143db44c04d4641ac9b64470f7a16ddf2e
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.