@@ -574,7 +574,7 @@ final class Qwen35DecoderLayer: Module {
574574// MARK: - Text Model
575575
576576public class Qwen35TextModelInner : Module , LayerPartitionable , StreamableMoE {
577- @ModuleInfo ( key: " embed_tokens " ) var embedTokens : Embedding
577+ @ModuleInfo ( key: " embed_tokens " ) public var embedTokens : Embedding
578578
579579 fileprivate let layers : [ Qwen35DecoderLayer ]
580580 let norm : MathRMSNorm
@@ -613,7 +613,7 @@ public class Qwen35TextModelInner: Module, LayerPartitionable, StreamableMoE {
613613 var hiddenStates = embedTokens ( inputs)
614614
615615 var cacheArray = cache
616- if cacheArray == nil {
616+ if cacheArray == nil || cacheArray ? . count != layers . count {
617617 cacheArray = Array ( repeating: nil as KVCache ? , count: layers. count)
618618 }
619619
@@ -633,6 +633,37 @@ public class Qwen35TextModelInner: Module, LayerPartitionable, StreamableMoE {
633633
634634 return norm ( hiddenStates)
635635 }
636+
637+ public func callCapturing( _ inputs: MLXArray , cache: [ KVCache ? ] ? = nil , captureLayerIDs: Set < Int > ) -> ( MLXArray , [ Int : MLXArray ] ) {
638+ var hiddenStates = embedTokens ( inputs)
639+
640+ var cacheArray = cache
641+ if cacheArray == nil || cacheArray? . count != layers. count {
642+ cacheArray = Array ( repeating: nil as KVCache ? , count: layers. count)
643+ }
644+
645+ let faMask = createAttentionMask ( h: hiddenStates, cache: cacheArray ? [ faIdx] )
646+ let ssmMask = createSSMMask ( h: hiddenStates, cache: cacheArray ? [ ssmIdx] as? MambaCache )
647+
648+ var captured = [ Int: MLXArray] ( )
649+
650+ for (i, layer) in layers. enumerated ( ) {
651+ let mask = layer. isLinear ? ssmMask : nil
652+ let attnMask =
653+ layer. isLinear
654+ ? MLXFast . ScaledDotProductAttentionMaskMode. none : faMask
655+ hiddenStates = partitionedLayerCall ( index: i, gpuLayerCount: gpuLayerCount, stream: streamExperts, cacheToEval: cacheArray ? [ i] ) {
656+ layer (
657+ hiddenStates, attentionMask: attnMask, ssmMask: mask, cache: cacheArray ? [ i] )
658+ }
659+
660+ if captureLayerIDs. contains ( i) {
661+ captured [ i] = hiddenStates
662+ }
663+ }
664+
665+ return ( norm ( hiddenStates) , captured)
666+ }
636667}
637668
638669public class Qwen35TextModel : Module , LLMModel , KVCacheDimensionProvider {
@@ -642,7 +673,7 @@ public class Qwen35TextModel: Module, LLMModel, KVCacheDimensionProvider {
642673 public let model : Qwen35TextModelInner
643674 let configuration : Qwen35TextConfiguration
644675
645- @ModuleInfo ( key: " lm_head " ) var lmHead : Linear ?
676+ @ModuleInfo ( key: " lm_head " ) public var lmHead : Linear ?
646677
647678 public init ( _ args: Qwen35TextConfiguration ) {
648679 self . configuration = args
@@ -725,7 +756,7 @@ public class Qwen35Model: Module, LLMModel, KVCacheDimensionProvider {
725756 public let vocabularySize : Int
726757 public let kvHeads : [ Int ]
727758
728- @ModuleInfo ( key: " language_model " ) var languageModel : Qwen35TextModel
759+ @ModuleInfo ( key: " language_model " ) public var languageModel : Qwen35TextModel
729760
730761 public init ( _ args: Qwen35Configuration ) {
731762 let textModel = Qwen35TextModel ( args. textConfig)
0 commit comments