mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-09-24 20:20:37 +00:00
fix: add graph cuts for MiniMax-H3 text conditioning (#1900)
This commit is contained in:
parent
2dc7f5408a
commit
36746936c0
@ -264,6 +264,9 @@ namespace MiniMaxH3 {
|
|||||||
for (int64_t i = 0; i < num_layers; ++i) {
|
for (int64_t i = 0; i < num_layers; ++i) {
|
||||||
auto block = std::dynamic_pointer_cast<TokenRefinerBlock>(blocks["blocks." + std::to_string(i)]);
|
auto block = std::dynamic_pointer_cast<TokenRefinerBlock>(blocks["blocks." + std::to_string(i)]);
|
||||||
x = block->forward(ctx, x);
|
x = block->forward(ctx, x);
|
||||||
|
sd::ggml_graph_cut::mark_graph_cut(x,
|
||||||
|
"minimax_h3.token_refiner.blocks." + std::to_string(i),
|
||||||
|
"hidden_states");
|
||||||
}
|
}
|
||||||
return std::dynamic_pointer_cast<RMSNorm>(blocks["final_norm"])->forward(ctx, x);
|
return std::dynamic_pointer_cast<RMSNorm>(blocks["final_norm"])->forward(ctx, x);
|
||||||
}
|
}
|
||||||
@ -527,7 +530,11 @@ namespace MiniMaxH3 {
|
|||||||
GGML_ASSERT(context->ne[0] == config.text_dim);
|
GGML_ASSERT(context->ne[0] == config.text_dim);
|
||||||
auto condition_proj = std::dynamic_pointer_cast<Linear>(blocks["condition_proj"]);
|
auto condition_proj = std::dynamic_pointer_cast<Linear>(blocks["condition_proj"]);
|
||||||
auto token_refiner = std::dynamic_pointer_cast<TokenRefiner>(blocks["token_refiner"]);
|
auto token_refiner = std::dynamic_pointer_cast<TokenRefiner>(blocks["token_refiner"]);
|
||||||
return token_refiner->forward(ctx, condition_proj->forward(ctx, context));
|
auto projected = condition_proj->forward(ctx, context);
|
||||||
|
sd::ggml_graph_cut::mark_graph_cut(projected,
|
||||||
|
"minimax_h3.condition_proj",
|
||||||
|
"hidden_states");
|
||||||
|
return token_refiner->forward(ctx, projected);
|
||||||
}
|
}
|
||||||
|
|
||||||
ggml_tensor* time_embedding(GGMLRunnerContext* ctx,
|
ggml_tensor* time_embedding(GGMLRunnerContext* ctx,
|
||||||
|
|||||||
@ -178,13 +178,13 @@ namespace Qwen {
|
|||||||
auto h = std::dynamic_pointer_cast<Linear>(blocks[name])->forward(ctx, x);
|
auto h = std::dynamic_pointer_cast<Linear>(blocks[name])->forward(ctx, x);
|
||||||
return ggml_reshape_4d(ctx->ggml_ctx, h, dim_head, heads, x->ne[1], x->ne[2]);
|
return ggml_reshape_4d(ctx->ggml_ctx, h, dim_head, heads, x->ne[1], x->ne[2]);
|
||||||
};
|
};
|
||||||
auto q = project("to_q");
|
auto q = project("to_q");
|
||||||
auto k = project("to_k");
|
auto k = project("to_k");
|
||||||
auto v = project("to_v");
|
auto v = project("to_v");
|
||||||
q = std::dynamic_pointer_cast<RMSNorm>(blocks["norm_q"])->forward(ctx, q);
|
q = std::dynamic_pointer_cast<RMSNorm>(blocks["norm_q"])->forward(ctx, q);
|
||||||
k = std::dynamic_pointer_cast<RMSNorm>(blocks["norm_k"])->forward(ctx, k);
|
k = std::dynamic_pointer_cast<RMSNorm>(blocks["norm_k"])->forward(ctx, k);
|
||||||
q = Rope::apply_rope(ctx->ggml_ctx, q, pe);
|
q = Rope::apply_rope(ctx->ggml_ctx, q, pe);
|
||||||
k = Rope::apply_rope(ctx->ggml_ctx, k, pe);
|
k = Rope::apply_rope(ctx->ggml_ctx, k, pe);
|
||||||
if (cache.mode == QwenImage21PrefixCache::Mode::STORE) {
|
if (cache.mode == QwenImage21PrefixCache::Mode::STORE) {
|
||||||
auto persist = [&](ggml_tensor* tensor, int axis, const char* name) {
|
auto persist = [&](ggml_tensor* tensor, int axis, const char* name) {
|
||||||
auto part = ggml_ext_slice(ctx->ggml_ctx, tensor, axis, 0, cache.prefix_length);
|
auto part = ggml_ext_slice(ctx->ggml_ctx, tensor, axis, 0, cache.prefix_length);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user