#pragma once #include "engine/framework/assets/tensor_source.h" #include "engine/framework/core/backend_weight_store.h" #include "engine/framework/core/execution_context.h" #include "engine/framework/modules/feed_forward_modules.h" #include "engine/framework/modules/linear_module.h" #include "engine/framework/modules/norm_modules.h" #include "engine/models/muscriptor/assets.h" #include "engine/models/muscriptor/types.h" #include #include #include #include #include namespace engine::models::muscriptor { class MuScriptorDecodeCacheStorage; struct MuScriptorLayerWeights { modules::LinearWeights in_proj; modules::LinearWeights out_proj; modules::NormWeights norm1; modules::NormWeights norm2; modules::FeedForwardWeights mlp; }; struct MuScriptorWeights { std::shared_ptr store; modules::LinearWeights mel_projection; core::TensorValue instrument_embedding; core::TensorValue dataset_embedding; core::TensorValue token_embedding; std::vector layers; modules::NormWeights output_norm; modules::LinearWeights output_head; }; enum class MuScriptorPerfMode { Exact, FlashAttention, }; struct MuScriptorDecoderOptions { assets::TensorStorageType weight_type = assets::TensorStorageType::Native; MuScriptorPerfMode perf_mode = MuScriptorPerfMode::FlashAttention; size_t weight_context_bytes = 512ull * 1024ull * 1024ull; size_t condition_graph_arena_bytes = 128ull * 1024ull * 1024ull; size_t prefill_graph_arena_bytes = 768ull * 1024ull * 1024ull; size_t decode_graph_arena_bytes = 512ull * 1024ull * 1024ull; }; class MuScriptorDecoderRuntime { public: MuScriptorDecoderRuntime( std::shared_ptr assets, core::ExecutionContext & execution, MuScriptorDecoderOptions options); ~MuScriptorDecoderRuntime(); MuScriptorConditioning condition( const std::vector & log_mel, const std::vector & mel_mask, const std::vector & instrument_ids, int32_t dataset_id); MuScriptorConditioning condition_batch( const std::vector & log_mel, const std::vector & mel_mask, const std::vector & instrument_ids, const std::vector & dataset_ids, int64_t batch); MuScriptorGeneratedChunk generate_greedy( const MuScriptorConditioning & conditioning, const std::vector & prompt, int64_t max_tokens, int32_t eos_id, const std::vector & forbidden_tokens); MuScriptorGeneratedChunk generate( const MuScriptorConditioning & conditioning, const MuScriptorConditioning * null_conditioning, const std::vector & prompt, int64_t max_tokens, int32_t eos_id, const std::vector & forbidden_tokens, const MuScriptorGenerationOptions & options); std::vector generate_batch( const MuScriptorConditioning & conditioning, const std::vector> & prompts, int64_t max_tokens, int32_t eos_id, const std::vector & forbidden_tokens, const MuScriptorGenerationOptions & options); private: class ConditionGraph; class PrefillGraph; class DecodeGraph; std::shared_ptr assets_; core::ExecutionContext & execution_; std::shared_ptr weights_; MuScriptorDecoderOptions options_; std::unique_ptr condition_graph_; std::unique_ptr prefill_graph_; std::unique_ptr decode_cache_; std::unique_ptr decode_graph_; }; } // namespace engine::models::muscriptor