@@ -190,6 +190,53 @@ def loss_fn(hidden_entry, param_a, param_b):
190190 assert grads [2 ].tolist () == [5.0 , 6.0 , 7.0 , 8.0 ]
191191
192192
193+ def test_fused_suffix_vjp_scales_bank_view_cotangents_by_loss_cotangent () -> None :
194+ artifact = _RecordingArtifact (sentinel_loss = 3.0 , sentinel_ntokens = 11.0 )
195+ bank_owner = _FakeBankOwner ()
196+ abi_map = _make_abi_map ()
197+ in_region_aliases = {
198+ "p_a" : {
199+ "logical_name" : "param_a" , "logical_grad_name" : "param_a_grad" ,
200+ "bank" : "f32" , "dtype" : "float32" ,
201+ "offset" : 60 , "size" : 4 , "logical_shape" : (4 ,),
202+ },
203+ "p_b" : {
204+ "logical_name" : "param_b" , "logical_grad_name" : "param_b_grad" ,
205+ "bank" : "f32" , "dtype" : "float32" ,
206+ "offset" : 64 , "size" : 4 , "logical_shape" : (4 ,),
207+ },
208+ }
209+ f = build_fused_suffix_custom_function (
210+ artifact = artifact , bank_owner = bank_owner , abi_map = abi_map ,
211+ hidden_entry_logical_name = "hidden_entry" ,
212+ target_ids_logical_name = "target_ids" ,
213+ target_mask_logical_name = "target_mask" ,
214+ loss_logical_name = "loss" ,
215+ ntokens_logical_name = "ntokens" ,
216+ in_region_parameter_bank_aliases = in_region_aliases ,
217+ parameter_order = ("p_a" , "p_b" ),
218+ )
219+
220+ hidden_entry = mx .full ((1 , 3 , 4 ), 1.0 , dtype = mx .float32 )
221+ target_ids = mx .zeros ((3 ,), dtype = mx .float32 )
222+ target_mask = mx .ones ((3 ,), dtype = mx .float32 )
223+ param_a = mx .zeros ((4 ,), dtype = mx .float32 )
224+ param_b = mx .zeros ((4 ,), dtype = mx .float32 )
225+
226+ def scaled_loss_fn (hidden_entry , param_a , param_b ):
227+ loss , _ntokens = f (hidden_entry , target_ids , target_mask , param_a , param_b )
228+ return loss * mx .array (3.0 , dtype = mx .float32 )
229+
230+ grad_fn = mx .value_and_grad (scaled_loss_fn , argnums = (0 , 1 , 2 ))
231+ val , grads = grad_fn (hidden_entry , param_a , param_b )
232+ mx .eval (val , * grads )
233+
234+ assert float (val ) == 9.0
235+ assert grads [0 ].tolist () == [[[21.0 ]* 4 ]* 3 ]
236+ assert grads [1 ].tolist () == [3.0 , 6.0 , 9.0 , 12.0 ]
237+ assert grads [2 ].tolist () == [15.0 , 18.0 , 21.0 , 24.0 ]
238+
239+
193240def test_fused_suffix_rejects_wrong_primal_count () -> None :
194241 artifact = _RecordingArtifact (0.0 , 0.0 )
195242 bank_owner = _FakeBankOwner ()
0 commit comments