From 5555c0c1f66d766c544c30699190dec0285bcbfc Mon Sep 17 00:00:00 2001 From: CentricStorm Date: Wed, 11 Dec 2024 22:40:40 +0000 Subject: [PATCH 001/372] docs: update server streaming mode documentation (#9519) Provide more documentation for streaming mode. --- examples/server/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/server/README.md b/examples/server/README.md index 2bd23d1a6..686be7baf 100644 --- a/examples/server/README.md +++ b/examples/server/README.md @@ -303,23 +303,23 @@ mkdir llama-client cd llama-client ``` -Create a index.js file and put this inside: +Create an index.js file and put this inside: ```javascript -const prompt = `Building a website can be done in 10 simple steps:`; +const prompt = "Building a website can be done in 10 simple steps:" -async function Test() { +async function test() { let response = await fetch("http://127.0.0.1:8080/completion", { - method: 'POST', + method: "POST", body: JSON.stringify({ prompt, - n_predict: 512, + n_predict: 64, }) }) console.log((await response.json()).content) } -Test() +test() ``` And run it: @@ -381,7 +381,7 @@ Multiple prompts are also supported. In this case, the completion result will be `n_keep`: Specify the number of tokens from the prompt to retain when the context size is exceeded and tokens need to be discarded. The number excludes the BOS token. By default, this value is set to `0`, meaning no tokens are kept. Use `-1` to retain all tokens from the prompt. -`stream`: It allows receiving each predicted token in real-time instead of waiting for the completion to finish. To enable this, set to `true`. +`stream`: Allows receiving each predicted token in real-time instead of waiting for the completion to finish (uses a different response format). To enable this, set to `true`. `stop`: Specify a JSON array of stopping strings. These words will not be included in the completion, so make sure to add them to the prompt for the next iteration. Default: `[]` @@ -446,7 +446,7 @@ These words will not be included in the completion, so make sure to add them to **Response format** -- Note: When using streaming mode (`stream`), only `content` and `stop` will be returned until end of completion. +- Note: In streaming mode (`stream`), only `content` and `stop` will be returned until end of completion. Responses are sent using the [Server-sent events](https://html.spec.whatwg.org/multipage/server-sent-events.html) standard. Note: the browser's `EventSource` interface cannot be used due to its lack of `POST` request support. - `completion_probabilities`: An array of token probabilities for each completion. The array's length is `n_predict`. Each item in the array has the following structure: From 9fdb1243049aa7e8211693f116daf2052d47507d Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Thu, 12 Dec 2024 16:57:32 +0100 Subject: [PATCH 002/372] common : add missing env var for speculative (#10801) --- common/arg.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index 49af31682..b27567f3b 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -2083,35 +2083,35 @@ common_params_context common_params_parser_init(common_params & params, llama_ex [](common_params & params, int value) { params.speculative.n_max = value; } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_DRAFT_MAX")); add_opt(common_arg( {"--draft-min", "--draft-n-min"}, "N", string_format("minimum number of draft tokens to use for speculative decoding (default: %d)", params.speculative.n_min), [](common_params & params, int value) { params.speculative.n_min = value; } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_DRAFT_MIN")); add_opt(common_arg( {"--draft-p-split"}, "P", string_format("speculative decoding split probability (default: %.1f)", (double)params.speculative.p_split), [](common_params & params, const std::string & value) { params.speculative.p_split = std::stof(value); } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE}).set_env("LLAMA_ARG_DRAFT_P_SPLIT")); add_opt(common_arg( {"--draft-p-min"}, "P", string_format("minimum speculative decoding probability (greedy) (default: %.1f)", (double)params.speculative.p_min), [](common_params & params, const std::string & value) { params.speculative.p_min = std::stof(value); } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_DRAFT_P_MIN")); add_opt(common_arg( {"-cd", "--ctx-size-draft"}, "N", string_format("size of the prompt context for the draft model (default: %d, 0 = loaded from model)", params.speculative.n_ctx), [](common_params & params, int value) { params.speculative.n_ctx = value; } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_CTX_SIZE_DRAFT")); add_opt(common_arg( {"-devd", "--device-draft"}, "", "comma-separated list of devices to use for offloading the draft model (none = don't offload)\n" @@ -2131,14 +2131,14 @@ common_params_context common_params_parser_init(common_params & params, llama_ex fprintf(stderr, "warning: consult docs/build.md for compilation instructions\n"); } } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_N_GPU_LAYERS_DRAFT")); add_opt(common_arg( {"-md", "--model-draft"}, "FNAME", "draft model for speculative decoding (default: unused)", [](common_params & params, const std::string & value) { params.speculative.model = value; } - ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER})); + ).set_examples({LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_MODEL_DRAFT")); return ctx_arg; } From dc5301d565b7d0b2c691f7df13099aab3997479c Mon Sep 17 00:00:00 2001 From: 0cc4m Date: Thu, 12 Dec 2024 18:35:37 +0100 Subject: [PATCH 003/372] Vulkan: Add VK_EXT_subgroup_size_control support to ensure full subgroups for coopmats (#10721) * Vulkan: Add VK_EXT_subgroup_size_control support to ensure full subgroups for coopmats * Fix subgroup size control extension support check Add accf32 and accf16 checks for coopmats * Also disable coopmats on amdvlk --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 182 ++++++++++++++++++++------- 1 file changed, 139 insertions(+), 43 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index a8ae58ee2..74d08815e 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -163,7 +163,11 @@ struct vk_device_struct { uint32_t shader_core_count; bool uma; bool float_controls_rte_fp16; - bool coopmat2; + + bool subgroup_size_control; + uint32_t subgroup_min_size; + uint32_t subgroup_max_size; + bool subgroup_require_full_support; bool coopmat_support; bool coopmat_acc_f32_support; @@ -171,6 +175,7 @@ struct vk_device_struct { uint32_t coopmat_m; uint32_t coopmat_n; uint32_t coopmat_k; + bool coopmat2; size_t idx; @@ -749,8 +754,12 @@ static uint32_t compile_count = 0; static std::mutex compile_count_mutex; static std::condition_variable compile_count_cond; -static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipeline, const std::string name, size_t spv_size, const void* spv_data, const std::string entrypoint, uint32_t parameter_count, uint32_t push_constant_size, std::array wg_denoms, std::vector specialization_constants, uint32_t align, bool disable_robustness) { - VK_LOG_DEBUG("ggml_vk_create_pipeline(" << device->name << ", " << name << ", " << entrypoint << ", " << parameter_count << ", " << push_constant_size << ", (" << wg_denoms[0] << "," << wg_denoms[1] << "," << wg_denoms[2] << "), specialization_constants, " << align << ")"); +static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipeline, const std::string name, size_t spv_size, const void* spv_data, const std::string entrypoint, + uint32_t parameter_count, uint32_t push_constant_size, std::array wg_denoms, std::vector specialization_constants, + uint32_t align, bool disable_robustness, bool require_full_subgroups, uint32_t required_subgroup_size) { + VK_LOG_DEBUG("ggml_vk_create_pipeline(" << device->name << ", " << name << ", " << entrypoint << ", " << parameter_count << ", " << push_constant_size << + ", (" << wg_denoms[0] << "," << wg_denoms[1] << "," << wg_denoms[2] << "), specialization_constants, " << align << + ", " << disable_robustness << ", " << require_full_subgroups << ", " << required_subgroup_size << ")"); GGML_ASSERT(parameter_count > 0); GGML_ASSERT(wg_denoms[0] > 0 && wg_denoms[1] > 0 && wg_denoms[2] > 0); // NOLINT @@ -809,14 +818,28 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin specialization_constants.data() ); + vk::PipelineShaderStageCreateFlags pipeline_shader_stage_create_flags{}; + + if (device->subgroup_require_full_support && require_full_subgroups) { + pipeline_shader_stage_create_flags |= vk::PipelineShaderStageCreateFlagBits::eRequireFullSubgroupsEXT; + } + vk::PipelineShaderStageCreateInfo pipeline_shader_create_info( - vk::PipelineShaderStageCreateFlags(), + pipeline_shader_stage_create_flags, vk::ShaderStageFlagBits::eCompute, pipeline->shader_module, entrypoint.c_str(), &specialization_info); + + vk::PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT pipeline_shader_stage_required_subgroup_size_create_info; + pipeline_shader_stage_required_subgroup_size_create_info.requiredSubgroupSize = required_subgroup_size; + if (device->subgroup_size_control && required_subgroup_size > 0) { + GGML_ASSERT(device->subgroup_min_size <= required_subgroup_size && required_subgroup_size <= device->subgroup_max_size); + pipeline_shader_create_info.setPNext(&pipeline_shader_stage_required_subgroup_size_create_info); + } + vk::ComputePipelineCreateInfo compute_pipeline_create_info( - vk::PipelineCreateFlags(), + vk::PipelineCreateFlags{}, pipeline_shader_create_info, pipeline->layout); @@ -1496,7 +1519,9 @@ static void ggml_vk_load_shaders(vk_device& device) { device->pipeline_matmul_id_f32 = std::make_shared(); std::vector> compiles; - auto const &ggml_vk_create_pipeline = [&](vk_device& device, vk_pipeline& pipeline, const std::string &name, size_t spv_size, const void* spv_data, const std::string &entrypoint, uint32_t parameter_count, uint32_t push_constant_size, std::array wg_denoms, const std::vector& specialization_constants, uint32_t align, bool disable_robustness = false) { + auto const &ggml_vk_create_pipeline = [&](vk_device& device, vk_pipeline& pipeline, const std::string &name, size_t spv_size, const void* spv_data, const std::string &entrypoint, + uint32_t parameter_count, uint32_t push_constant_size, std::array wg_denoms, const std::vector& specialization_constants, + uint32_t align, bool disable_robustness = false, bool require_full_subgroups = false, uint32_t required_subgroup_size = 0) { { // wait until fewer than N compiles are in progress uint32_t N = std::max(1u, std::thread::hardware_concurrency()); @@ -1506,7 +1531,8 @@ static void ggml_vk_load_shaders(vk_device& device) { } compile_count++; } - compiles.push_back(std::async(ggml_vk_create_pipeline_func, std::ref(device), std::ref(pipeline), name, spv_size, spv_data, entrypoint, parameter_count, push_constant_size, wg_denoms, specialization_constants, align, disable_robustness)); + compiles.push_back(std::async(ggml_vk_create_pipeline_func, std::ref(device), std::ref(pipeline), name, spv_size, spv_data, entrypoint, + parameter_count, push_constant_size, wg_denoms, specialization_constants, align, disable_robustness, require_full_subgroups, required_subgroup_size)); }; #if defined(VK_NV_cooperative_matrix2) && defined(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT) @@ -1612,40 +1638,59 @@ static void ggml_vk_load_shaders(vk_device& device) { // Create 6 variants, {s,m,l}x{unaligned,aligned} #define CREATE_MM(PIPELINE_NAME, NAMELC, F16ACC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ if (device->mul_mat ## ID ## _l) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->l, #NAMELC #F16ACC "_l", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->l, #NAMELC #F16ACC "_l", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1, false, true); \ if (device->mul_mat ## ID ## _m) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->m, #NAMELC #F16ACC "_m", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->m, #NAMELC #F16ACC "_m", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1, false, true); \ if (device->mul_mat ## ID ## _s) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->s, #NAMELC #F16ACC "_s", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->s, #NAMELC #F16ACC "_s", NAMELC ## F16ACC ## _coopmat_len, NAMELC ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1, false, true); \ if (device->mul_mat ## ID ## _l) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_l, #NAMELC #F16ACC "_aligned_l", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, l_align); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_l, #NAMELC #F16ACC "_aligned_l", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, l_align, false, true); \ if (device->mul_mat ## ID ## _m) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_m, #NAMELC #F16ACC "_aligned_m", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, m_align); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_m, #NAMELC #F16ACC "_aligned_m", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, m_align, false, true); \ if (device->mul_mat ## ID ## _s) \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _coopmat_len, NAMELC ## _aligned ## F16ACC ## _coopmat_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align, false, true); \ // Create 2 variants, {f16,f32} accumulator #define CREATE_MM2(PIPELINE_NAME, NAMELC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ - CREATE_MM(PIPELINE_NAME . f16acc, NAMELC, _f16acc, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ - CREATE_MM(PIPELINE_NAME . f32acc, NAMELC, , WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + if (device->coopmat_acc_f16_support) { \ + CREATE_MM(PIPELINE_NAME . f16acc, NAMELC, _f16acc, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + } \ + if (device->coopmat_acc_f32_support) { \ + CREATE_MM(PIPELINE_NAME . f32acc, NAMELC, , WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + } \ CREATE_MM(pipeline_matmul_f32, matmul_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); CREATE_MM(pipeline_matmul_f32_f16, matmul_f32_f16, , wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); CREATE_MM2(pipeline_matmul_f16, matmul_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); CREATE_MM2(pipeline_matmul_f16_f32, matmul_f16_f32, wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_0].f16acc, matmul_q4_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_1].f16acc, matmul_q4_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_0].f16acc, matmul_q5_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_1].f16acc, matmul_q5_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q8_0].f16acc, matmul_q8_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + if (device->coopmat_acc_f16_support) { + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_0].f16acc, matmul_q4_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_1].f16acc, matmul_q4_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_0].f16acc, matmul_q5_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_1].f16acc, matmul_q5_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q8_0].f16acc, matmul_q8_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q2_K].f16acc, matmul_q2_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q3_K].f16acc, matmul_q3_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_K].f16acc, matmul_q4_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_K].f16acc, matmul_q5_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q6_K].f16acc, matmul_q6_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); - CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_IQ4_NL].f16acc, matmul_iq4_nl_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q2_K].f16acc, matmul_q2_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q3_K].f16acc, matmul_q3_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_K].f16acc, matmul_q4_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_K].f16acc, matmul_q5_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q6_K].f16acc, matmul_q6_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_IQ4_NL].f16acc, matmul_iq4_nl_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + } else { + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_0].f16acc, matmul_q4_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_1].f16acc, matmul_q4_1_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_0].f16acc, matmul_q5_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_1].f16acc, matmul_q5_1_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q8_0].f16acc, matmul_q8_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q2_K].f16acc, matmul_q2_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q3_K].f16acc, matmul_q3_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q4_K].f16acc, matmul_q4_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q5_K].f16acc, matmul_q5_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_Q6_K].f16acc, matmul_q6_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + CREATE_MM(pipeline_dequant_mul_mat_mat[GGML_TYPE_IQ4_NL].f16acc, matmul_iq4_nl_f32, , wg_denoms, warptile_mmq, vk_mat_mat_push_constants, 3, ); + } // If there's not enough shared memory for row_ids and the result tile, don't create these pipelines. if (device->mul_mat_id_s || device->mul_mat_id_m || device->mul_mat_id_l) { @@ -1653,19 +1698,35 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MM2(pipeline_matmul_id_f16, matmul_id_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); CREATE_MM2(pipeline_matmul_id_f16_f32, matmul_id_f16_f32, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f16acc, matmul_id_q4_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f16acc, matmul_id_q4_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f16acc, matmul_id_q5_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f16acc, matmul_id_q5_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f16acc, matmul_id_q8_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + if (device->coopmat_acc_f16_support) { + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f16acc, matmul_id_q4_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f16acc, matmul_id_q4_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f16acc, matmul_id_q5_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f16acc, matmul_id_q5_1_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f16acc, matmul_id_q8_0_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f16acc, matmul_id_q2_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f16acc, matmul_id_q3_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f16acc, matmul_id_q4_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f16acc, matmul_id_q5_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f16acc, matmul_id_q6_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); - CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f16acc, matmul_id_iq4_nl_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f16acc, matmul_id_q2_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f16acc, matmul_id_q3_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f16acc, matmul_id_q4_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f16acc, matmul_id_q5_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f16acc, matmul_id_q6_k_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f16acc, matmul_id_iq4_nl_f32, _f16acc, wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + } else { + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_0].f16acc, matmul_id_q4_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_1].f16acc, matmul_id_q4_1_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_0].f16acc, matmul_id_q5_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_1].f16acc, matmul_id_q5_1_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q8_0].f16acc, matmul_id_q8_0_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q2_K].f16acc, matmul_id_q2_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q3_K].f16acc, matmul_id_q3_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q4_K].f16acc, matmul_id_q4_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q5_K].f16acc, matmul_id_q5_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f16acc, matmul_id_q6_k_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f16acc, matmul_id_iq4_nl_f32, , wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); + } } +#undef CREATE_MM2 #undef CREATE_MM } else if (device->fp16) { // Create 6 variants, {s,m,l}x{unaligned,aligned} @@ -1683,6 +1744,11 @@ static void ggml_vk_load_shaders(vk_device& device) { if (device->mul_mat ## ID ## _s) \ ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _len, NAMELC ## _aligned ## F16ACC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align); \ + // Create 2 variants, {f16,f32} accumulator +#define CREATE_MM2(PIPELINE_NAME, NAMELC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + CREATE_MM(PIPELINE_NAME . f16acc, NAMELC, _f16acc, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + CREATE_MM(PIPELINE_NAME . f32acc, NAMELC, , WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ + CREATE_MM(pipeline_matmul_f32, matmul_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); CREATE_MM(pipeline_matmul_f32_f16, matmul_f32_f16, , wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); CREATE_MM2(pipeline_matmul_f16, matmul_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 3, ); @@ -1720,6 +1786,7 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f16acc, matmul_id_q6_k_f32, _f16acc, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f16acc, matmul_id_iq4_nl_f32, _f16acc, mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); } +#undef CREATE_MM2 #undef CREATE_MM } else { // Create 6 variants, {s,m,l}x{unaligned,aligned} @@ -1774,7 +1841,6 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_Q6_K].f32acc, matmul_id_q6_k_f32, , mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); CREATE_MM(pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL].f32acc, matmul_id_iq4_nl_f32, , mmq_wg_denoms, warptile_mmq, vk_mat_mat_id_push_constants, 4, _id); } -#undef CREATE_MM2 #undef CREATE_MM } @@ -1998,6 +2064,8 @@ static vk_device ggml_vk_get_device(size_t idx) { amd_shader_core_properties2 = true; } else if (strcmp("VK_EXT_pipeline_robustness", properties.extensionName) == 0) { pipeline_robustness = true; + } else if (strcmp("VK_EXT_subgroup_size_control", properties.extensionName) == 0) { + device->subgroup_size_control = true; } else if (strcmp("VK_KHR_cooperative_matrix", properties.extensionName) == 0 && !getenv("GGML_VK_DISABLE_COOPMAT")) { device->coopmat_support = true; @@ -2018,6 +2086,8 @@ static vk_device ggml_vk_get_device(size_t idx) { vk::PhysicalDeviceShaderSMBuiltinsPropertiesNV sm_props; vk::PhysicalDeviceShaderCoreProperties2AMD amd_shader_core_properties2_props; vk::PhysicalDeviceVulkan12Properties vk12_props; + vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT subgroup_size_control_props; + props2.pNext = &props3; props3.pNext = &subgroup_props; subgroup_props.pNext = &driver_props; @@ -2037,6 +2107,10 @@ static vk_device ggml_vk_get_device(size_t idx) { last_struct->pNext = (VkBaseOutStructure *)&amd_shader_core_properties2_props; last_struct = (VkBaseOutStructure *)&amd_shader_core_properties2_props; } + if (device->subgroup_size_control) { + last_struct->pNext = (VkBaseOutStructure *)&subgroup_size_control_props; + last_struct = (VkBaseOutStructure *)&subgroup_size_control_props; + } #if defined(VK_NV_cooperative_matrix2) vk::PhysicalDeviceCooperativeMatrix2PropertiesNV coopmat2_props; @@ -2075,7 +2149,7 @@ static vk_device ggml_vk_get_device(size_t idx) { device->fp16 = !force_disable_f16 && fp16_storage && fp16_compute; - if (device->vendor_id == VK_VENDOR_ID_INTEL || (props2.properties.vendorID == VK_VENDOR_ID_AMD && driver_props.driverID == vk::DriverId::eAmdProprietary)) { + if (device->vendor_id == VK_VENDOR_ID_INTEL || (device->vendor_id == VK_VENDOR_ID_AMD && (driver_props.driverID == vk::DriverId::eAmdProprietary || driver_props.driverID == vk::DriverId::eAmdOpenSource))) { // Intel drivers don't support coopmat properly yet // Only RADV supports coopmat properly on AMD device->coopmat_support = false; @@ -2131,6 +2205,17 @@ static vk_device ggml_vk_get_device(size_t idx) { device_extensions.push_back("VK_EXT_pipeline_robustness"); } + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_size_control_features; + subgroup_size_control_features.pNext = nullptr; + subgroup_size_control_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT; + subgroup_size_control_features.computeFullSubgroups = false; + subgroup_size_control_features.subgroupSizeControl = false; + + if (device->subgroup_size_control) { + last_struct->pNext = (VkBaseOutStructure *)&subgroup_size_control_features; + last_struct = (VkBaseOutStructure *)&subgroup_size_control_features; + } + VkPhysicalDeviceCooperativeMatrixFeaturesKHR coopmat_features; coopmat_features.pNext = nullptr; coopmat_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR; @@ -2158,6 +2243,17 @@ static vk_device ggml_vk_get_device(size_t idx) { device->pipeline_robustness = pl_robustness_features.pipelineRobustness; + device->subgroup_size_control = device->subgroup_size_control && + (subgroup_size_control_props.requiredSubgroupSizeStages & vk::ShaderStageFlagBits::eCompute) && + subgroup_size_control_features.subgroupSizeControl; + + if (device->subgroup_size_control) { + device->subgroup_min_size = subgroup_size_control_props.minSubgroupSize; + device->subgroup_max_size = subgroup_size_control_props.maxSubgroupSize; + device->subgroup_require_full_support = subgroup_size_control_features.computeFullSubgroups; + device_extensions.push_back("VK_EXT_subgroup_size_control"); + } + device->coopmat_support = device->coopmat_support && coopmat_features.cooperativeMatrix; if (coopmat2_support) { @@ -2307,7 +2403,7 @@ static vk_device ggml_vk_get_device(size_t idx) { } } - if (device->coopmat_m == 0) { + if (device->coopmat_m == 0 || !device->coopmat_acc_f32_support) { // No suitable matmul mode found GGML_LOG_DEBUG("ggml_vulkan: WARNING: No suitable matrix core mode found. Disabling matrix cores.\n"); device->coopmat_support = false; @@ -2440,7 +2536,7 @@ static void ggml_vk_print_gpu_info(size_t idx) { } } - if (props2.properties.vendorID == VK_VENDOR_ID_INTEL || (props2.properties.vendorID == VK_VENDOR_ID_AMD && driver_props.driverID == vk::DriverId::eAmdProprietary)) { + if (props2.properties.vendorID == VK_VENDOR_ID_INTEL || (props2.properties.vendorID == VK_VENDOR_ID_AMD && (driver_props.driverID == vk::DriverId::eAmdProprietary || driver_props.driverID == vk::DriverId::eAmdOpenSource))) { // Intel drivers don't support coopmat properly yet // Only RADV supports coopmat properly on AMD coopmat_support = false; @@ -2727,7 +2823,7 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_pipeline(ggml_backend_vk_conte if (src0_type == GGML_TYPE_F32 && src1_type == GGML_TYPE_F16) { return ctx->device->pipeline_matmul_f32_f16; } - if (prec == GGML_PREC_DEFAULT && ctx->device->fp16) { + if (prec == GGML_PREC_DEFAULT && ctx->device->fp16 && !(ctx->device->coopmat_support && !ctx->device->coopmat_acc_f16_support)) { if (src0_type == GGML_TYPE_F16 && src1_type == GGML_TYPE_F32) { return ctx->device->pipeline_matmul_f16_f32.f16acc; } @@ -2802,7 +2898,7 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_id_pipeline(ggml_backend_vk_co if (src0_type == GGML_TYPE_F32 && src1_type == GGML_TYPE_F32) { return ctx->device->pipeline_matmul_id_f32; } - if (prec == GGML_PREC_DEFAULT && ctx->device->fp16) { + if (prec == GGML_PREC_DEFAULT && ctx->device->fp16 && !(ctx->device->coopmat_support && !ctx->device->coopmat_acc_f16_support)) { if (src0_type == GGML_TYPE_F16 && src1_type == GGML_TYPE_F32) { return ctx->device->pipeline_matmul_id_f16_f32.f16acc; } From 4064c0e3b6c27440f5d12b7caaf90b4088c28c61 Mon Sep 17 00:00:00 2001 From: 0cc4m Date: Thu, 12 Dec 2024 18:36:00 +0100 Subject: [PATCH 004/372] Vulkan: Use improved q4_k and q5_k dequant code in dequant shaders (#10798) --- .../vulkan-shaders/dequant_q4_k.comp | 64 ++++++++++------- .../vulkan-shaders/dequant_q5_k.comp | 68 +++++++++++-------- 2 files changed, 78 insertions(+), 54 deletions(-) diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp index 92acb7540..987f113a3 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp @@ -9,8 +9,8 @@ layout (binding = 1) writeonly buffer D {D_TYPE data_b[];}; void main() { [[unroll]] for (uint wgy = 0; wgy < 256; wgy++) { - const uint i = gl_WorkGroupID.x * 256 + wgy; - if (i >= p.M * p.K / QUANT_K) { + const uint ib = gl_WorkGroupID.x * 256 + wgy; + if (ib >= p.M * p.K / QUANT_K) { return; } @@ -20,37 +20,49 @@ void main() { const uint is = 2 * il; const uint n = 4; - const FLOAT_TYPE dall = FLOAT_TYPE(data_a[i].d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[i].d.y); + const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].d.x); + const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].d.y); - const uint y_idx = i * QUANT_K + 64 * il + n * ir; + const uint y_idx = ib * QUANT_K + 64 * il + n * ir; const uint qs_idx = 32*il + n * ir; - uint8_t sc; - uint8_t m; - if (is < 4) { - sc = uint8_t(data_a[i].scales[is] & 63); - m = uint8_t(data_a[i].scales[is + 4] & 63); - } else { - sc = uint8_t((data_a[i].scales[is + 4] & 0xF) | ((data_a[i].scales[is - 4] >> 6) << 4)); - m = uint8_t((data_a[i].scales[is + 4] >> 4) | ((data_a[i].scales[is ] >> 6) << 4)); - } - const FLOAT_TYPE d1 = dall * sc; - const FLOAT_TYPE m1 = dmin * m; + uint scidx0 = (is < 4) ? is : (is + 4); + uint scidx1 = (is < 4) ? is : (is - 4); + uint scidxmask1 = (is < 4) ? 0x30 : 0xC0; + uint scidxshift1 = (is < 4) ? 0 : 2; + uint mbidx0 = is + 4; + uint mbidx1 = (is < 4) ? is + 4 : is; + uint mbidxmask0 = (is < 4) ? 0xF : 0xF0; + uint mbidxshift0 = (is < 4) ? 0 : 4; + uint mbidxmask1 = (is < 4) ? 0x30 : 0xC0; + uint mbidxshift1 = (is < 4) ? 0 : 2; + + uint8_t sc = uint8_t((data_a[ib].scales[scidx0] & 0xF) | ((data_a[ib].scales[scidx1] & scidxmask1) >> scidxshift1)); + uint8_t mbyte = uint8_t((data_a[ib].scales[mbidx0] & mbidxmask0) >> mbidxshift0 | ((data_a[ib].scales[mbidx1] & mbidxmask1) >> mbidxshift1)); + + const FLOAT_TYPE d1 = dall * sc; + const FLOAT_TYPE m1 = dmin * mbyte; + + scidx0 = (is < 4) ? is + 1 : (is + 5); + scidx1 = (is < 4) ? is + 1 : (is - 3); + scidxmask1 = (is < 4) ? 0x30 : 0xC0; + scidxshift1 = (is < 4) ? 0 : 2; + mbidx0 = is + 5; + mbidx1 = (is < 4) ? is + 5 : is + 1; + mbidxmask0 = (is < 4) ? 0xF : 0xF0; + mbidxshift0 = (is < 4) ? 0 : 4; + mbidxmask1 = (is < 4) ? 0x30 : 0xC0; + mbidxshift1 = (is < 4) ? 0 : 2; + + sc = uint8_t((data_a[ib].scales[scidx0] & 0xF) | ((data_a[ib].scales[scidx1] & scidxmask1) >> scidxshift1)); + mbyte = uint8_t((data_a[ib].scales[mbidx0] & mbidxmask0) >> mbidxshift0 | ((data_a[ib].scales[mbidx1] & mbidxmask1) >> mbidxshift1)); - if (is < 4) { - sc = uint8_t(data_a[i].scales[is + 1] & 63); - m = uint8_t(data_a[i].scales[is + 5] & 63); - } else { - sc = uint8_t((data_a[i].scales[is + 5] & 0xF) | ((data_a[i].scales[is - 3] >> 6) << 4)); - m = uint8_t((data_a[i].scales[is + 5] >> 4) | ((data_a[i].scales[is + 1] >> 6) << 4)); - } const FLOAT_TYPE d2 = dall * sc; - const FLOAT_TYPE m2 = dmin * m; + const FLOAT_TYPE m2 = dmin * mbyte; [[unroll]] for (uint l = 0; l < n; ++l) { - data_b[y_idx + l ] = D_TYPE(d1 * FLOAT_TYPE(data_a[i].qs[qs_idx + l] & 0xF) - m1); - data_b[y_idx + l + 32] = D_TYPE(d2 * FLOAT_TYPE(data_a[i].qs[qs_idx + l] >> 4) - m2); + data_b[y_idx + l ] = D_TYPE(d1 * FLOAT_TYPE(data_a[ib].qs[qs_idx + l] & 0xF) - m1); + data_b[y_idx + l + 32] = D_TYPE(d2 * FLOAT_TYPE(data_a[ib].qs[qs_idx + l] >> 4) - m2); } } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp index f314a76d1..6db5403b6 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp @@ -9,8 +9,8 @@ layout (binding = 1) writeonly buffer D {D_TYPE data_b[];}; void main() { [[unroll]] for (uint wgy = 0; wgy < 256; wgy++) { - const uint i = gl_WorkGroupID.x * 256 + wgy; - if (i >= p.M * p.K / QUANT_K) { + const uint ib = gl_WorkGroupID.x * 256 + wgy; + if (ib >= p.M * p.K / QUANT_K) { return; } @@ -19,40 +19,52 @@ void main() { const uint ir = tid % 16; const uint is = 2 * il; - const FLOAT_TYPE dall = FLOAT_TYPE(data_a[i].d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[i].d.y); + const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].d.x); + const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].d.y); - const uint y_idx = i * QUANT_K + 64 * il + 2 * ir; + const uint y_idx = ib * QUANT_K + 64 * il + 2 * ir; const uint qs_idx = 32*il + 2 * ir; const uint qh_idx = 2 * ir; - uint8_t sc; - uint8_t m; - if (is < 4) { - sc = uint8_t(data_a[i].scales[is] & 63); - m = uint8_t(data_a[i].scales[is + 4] & 63); - } else { - sc = uint8_t((data_a[i].scales[is + 4] & 0xF) | ((data_a[i].scales[is - 4] >> 6) << 4)); - m = uint8_t((data_a[i].scales[is + 4] >> 4) | ((data_a[i].scales[is ] >> 6) << 4)); - } - const FLOAT_TYPE d1 = dall * sc; - const FLOAT_TYPE m1 = dmin * m; + uint scidx0 = (is < 4) ? is : (is + 4); + uint scidx1 = (is < 4) ? is : (is - 4); + uint scidxmask1 = (is < 4) ? 0x30 : 0xC0; + uint scidxshift1 = (is < 4) ? 0 : 2; + uint mbidx0 = is + 4; + uint mbidx1 = (is < 4) ? is + 4 : is; + uint mbidxmask0 = (is < 4) ? 0xF : 0xF0; + uint mbidxshift0 = (is < 4) ? 0 : 4; + uint mbidxmask1 = (is < 4) ? 0x30 : 0xC0; + uint mbidxshift1 = (is < 4) ? 0 : 2; + + uint8_t sc = uint8_t((data_a[ib].scales[scidx0] & 0xF) | ((data_a[ib].scales[scidx1] & scidxmask1) >> scidxshift1)); + uint8_t mbyte = uint8_t((data_a[ib].scales[mbidx0] & mbidxmask0) >> mbidxshift0 | ((data_a[ib].scales[mbidx1] & mbidxmask1) >> mbidxshift1)); + + const FLOAT_TYPE d1 = dall * sc; + const FLOAT_TYPE m1 = dmin * mbyte; + + scidx0 = (is < 4) ? is + 1 : (is + 5); + scidx1 = (is < 4) ? is + 1 : (is - 3); + scidxmask1 = (is < 4) ? 0x30 : 0xC0; + scidxshift1 = (is < 4) ? 0 : 2; + mbidx0 = is + 5; + mbidx1 = (is < 4) ? is + 5 : is + 1; + mbidxmask0 = (is < 4) ? 0xF : 0xF0; + mbidxshift0 = (is < 4) ? 0 : 4; + mbidxmask1 = (is < 4) ? 0x30 : 0xC0; + mbidxshift1 = (is < 4) ? 0 : 2; + + sc = uint8_t((data_a[ib].scales[scidx0] & 0xF) | ((data_a[ib].scales[scidx1] & scidxmask1) >> scidxshift1)); + mbyte = uint8_t((data_a[ib].scales[mbidx0] & mbidxmask0) >> mbidxshift0 | ((data_a[ib].scales[mbidx1] & mbidxmask1) >> mbidxshift1)); - if (is < 4) { - sc = uint8_t(data_a[i].scales[is + 1] & 63); - m = uint8_t(data_a[i].scales[is + 5] & 63); - } else { - sc = uint8_t((data_a[i].scales[is + 5] & 0xF) | ((data_a[i].scales[is - 3] >> 6) << 4)); - m = uint8_t((data_a[i].scales[is + 5] >> 4) | ((data_a[i].scales[is + 1] >> 6) << 4)); - } const FLOAT_TYPE d2 = dall * sc; - const FLOAT_TYPE m2 = dmin * m; + const FLOAT_TYPE m2 = dmin * mbyte; const uint8_t hm1 = uint8_t(1 << (2 * il )); const uint8_t hm2 = uint8_t(1 << (2 * il + 1)); - data_b[y_idx ] = D_TYPE(d1 * FLOAT_TYPE((data_a[i].qs[qs_idx ] & 0xF) + (((data_a[i].qh[qh_idx ] & hm1) != 0) ? 16 : 0)) - m1); - data_b[y_idx + 1] = D_TYPE(d1 * FLOAT_TYPE((data_a[i].qs[qs_idx + 1] & 0xF) + (((data_a[i].qh[qh_idx + 1] & hm1) != 0) ? 16 : 0)) - m1); - data_b[y_idx + 32] = D_TYPE(d2 * FLOAT_TYPE((data_a[i].qs[qs_idx ] >> 4) + (((data_a[i].qh[qh_idx ] & hm2) != 0) ? 16 : 0)) - m2); - data_b[y_idx + 33] = D_TYPE(d2 * FLOAT_TYPE((data_a[i].qs[qs_idx + 1] >> 4) + (((data_a[i].qh[qh_idx + 1] & hm2) != 0) ? 16 : 0)) - m2); + data_b[y_idx ] = D_TYPE(d1 * FLOAT_TYPE((data_a[ib].qs[qs_idx ] & 0xF) + (((data_a[ib].qh[qh_idx ] & hm1) != 0) ? 16 : 0)) - m1); + data_b[y_idx + 1] = D_TYPE(d1 * FLOAT_TYPE((data_a[ib].qs[qs_idx + 1] & 0xF) + (((data_a[ib].qh[qh_idx + 1] & hm1) != 0) ? 16 : 0)) - m1); + data_b[y_idx + 32] = D_TYPE(d2 * FLOAT_TYPE((data_a[ib].qs[qs_idx ] >> 4) + (((data_a[ib].qh[qh_idx ] & hm2) != 0) ? 16 : 0)) - m2); + data_b[y_idx + 33] = D_TYPE(d2 * FLOAT_TYPE((data_a[ib].qs[qs_idx + 1] >> 4) + (((data_a[ib].qh[qh_idx + 1] & hm2) != 0) ? 16 : 0)) - m2); } } From cb13ef85a444eb52a3f1b82dce198ceb25606583 Mon Sep 17 00:00:00 2001 From: Diego Devesa Date: Thu, 12 Dec 2024 19:02:49 +0100 Subject: [PATCH 005/372] remove CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS (#10797) other windows build fixes --- examples/CMakeLists.txt | 12 ++++- examples/gguf-split/gguf-split.cpp | 4 +- examples/llama-bench/llama-bench.cpp | 10 ++--- examples/retrieval/retrieval.cpp | 2 +- examples/tokenize/tokenize.cpp | 2 +- ggml/CMakeLists.txt | 7 +++ ggml/src/CMakeLists.txt | 5 --- ggml/src/ggml-cpu/amx/amx.cpp | 2 +- ggml/src/ggml-cpu/ggml-cpu.c | 5 +-- ggml/src/ggml-impl.h | 8 ++-- ggml/src/ggml-threading.h | 6 ++- src/CMakeLists.txt | 7 --- src/llama.cpp | 6 +-- tests/CMakeLists.txt | 65 +++++++++++++++------------- 14 files changed, 76 insertions(+), 65 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9210e9fea..b2df4f2fb 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -20,7 +20,12 @@ else() add_subdirectory(batched) add_subdirectory(embedding) add_subdirectory(eval-callback) - add_subdirectory(gbnf-validator) + + if (NOT WIN32) + # disabled on Windows because it uses internal functions not exported with LLAMA_API + add_subdirectory(gbnf-validator) + endif() + add_subdirectory(gguf-hash) add_subdirectory(gguf-split) add_subdirectory(gguf) @@ -51,7 +56,10 @@ else() add_subdirectory(convert-llama2c-to-ggml) add_subdirectory(cvector-generator) add_subdirectory(export-lora) - add_subdirectory(quantize-stats) + if (NOT WIN32) + # disabled on Windows because it uses internal functions not exported with LLAMA_API + add_subdirectory(quantize-stats) + endif() add_subdirectory(llava) if (GGML_RPC) add_subdirectory(rpc) diff --git a/examples/gguf-split/gguf-split.cpp b/examples/gguf-split/gguf-split.cpp index 7e62657e1..75f63f938 100644 --- a/examples/gguf-split/gguf-split.cpp +++ b/examples/gguf-split/gguf-split.cpp @@ -287,7 +287,7 @@ struct split_strategy { } void print_info() { - printf("n_split: %ld\n", ctx_outs.size()); + printf("n_split: %zu\n", ctx_outs.size()); int i_split = 0; for (auto & ctx_out : ctx_outs) { // re-calculate the real gguf size for each split (= metadata size + total size of all tensors) @@ -297,7 +297,7 @@ struct split_strategy { total_size += ggml_nbytes(t); } total_size = total_size / 1000 / 1000; // convert to megabytes - printf("split %05d: n_tensors = %d, total_size = %ldM\n", i_split + 1, gguf_get_n_tensors(ctx_out), total_size); + printf("split %05d: n_tensors = %d, total_size = %zuM\n", i_split + 1, gguf_get_n_tensors(ctx_out), total_size); i_split++; } } diff --git a/examples/llama-bench/llama-bench.cpp b/examples/llama-bench/llama-bench.cpp index bac606f47..2338ad106 100644 --- a/examples/llama-bench/llama-bench.cpp +++ b/examples/llama-bench/llama-bench.cpp @@ -1521,7 +1521,7 @@ int main(int argc, char ** argv) { for (const auto & inst : params_instances) { params_idx++; if (params.progress) { - fprintf(stderr, "llama-bench: benchmark %d/%ld: starting\n", params_idx, params_count); + fprintf(stderr, "llama-bench: benchmark %d/%zu: starting\n", params_idx, params_count); } // keep the same model between tests when possible if (!lmodel || !prev_inst || !inst.equal_mparams(*prev_inst)) { @@ -1573,14 +1573,14 @@ int main(int argc, char ** argv) { // warmup run if (t.n_prompt > 0) { if (params.progress) { - fprintf(stderr, "llama-bench: benchmark %d/%ld: warmup prompt run\n", params_idx, params_count); + fprintf(stderr, "llama-bench: benchmark %d/%zu: warmup prompt run\n", params_idx, params_count); } //test_prompt(ctx, std::min(t.n_batch, std::min(t.n_prompt, 32)), 0, t.n_batch, t.n_threads); test_prompt(ctx, t.n_prompt, t.n_batch, t.n_threads); } if (t.n_gen > 0) { if (params.progress) { - fprintf(stderr, "llama-bench: benchmark %d/%ld: warmup generation run\n", params_idx, params_count); + fprintf(stderr, "llama-bench: benchmark %d/%zu: warmup generation run\n", params_idx, params_count); } test_gen(ctx, 1, t.n_threads); } @@ -1592,14 +1592,14 @@ int main(int argc, char ** argv) { if (t.n_prompt > 0) { if (params.progress) { - fprintf(stderr, "llama-bench: benchmark %d/%ld: prompt run %d/%d\n", params_idx, params_count, + fprintf(stderr, "llama-bench: benchmark %d/%zu: prompt run %d/%d\n", params_idx, params_count, i + 1, params.reps); } test_prompt(ctx, t.n_prompt, t.n_batch, t.n_threads); } if (t.n_gen > 0) { if (params.progress) { - fprintf(stderr, "llama-bench: benchmark %d/%ld: generation run %d/%d\n", params_idx, params_count, + fprintf(stderr, "llama-bench: benchmark %d/%zu: generation run %d/%d\n", params_idx, params_count, i + 1, params.reps); } test_gen(ctx, t.n_gen, t.n_threads); diff --git a/examples/retrieval/retrieval.cpp b/examples/retrieval/retrieval.cpp index e78a8596d..23ff4db27 100644 --- a/examples/retrieval/retrieval.cpp +++ b/examples/retrieval/retrieval.cpp @@ -143,7 +143,7 @@ int main(int argc, char ** argv) { std::vector file_chunk = chunk_file(context_file, params.chunk_size, params.chunk_separator); chunks.insert(chunks.end(), file_chunk.begin(), file_chunk.end()); } - LOG_INF("Number of chunks: %ld\n", chunks.size()); + LOG_INF("Number of chunks: %zu\n", chunks.size()); llama_backend_init(); llama_numa_init(params.numa); diff --git a/examples/tokenize/tokenize.cpp b/examples/tokenize/tokenize.cpp index 12ad54256..c97e22724 100644 --- a/examples/tokenize/tokenize.cpp +++ b/examples/tokenize/tokenize.cpp @@ -394,7 +394,7 @@ int main(int raw_argc, char ** raw_argv) { } if (show_token_count) { - printf("Total number of tokens: %ld\n", tokens.size()); + printf("Total number of tokens: %zu\n", tokens.size()); } // silence valgrind llama_free(ctx); diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index 1b3d98967..c91e93163 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -32,6 +32,13 @@ else() endif() endif() +# remove the lib prefix on win32 mingw +if (WIN32) + set(CMAKE_STATIC_LIBRARY_PREFIX "") + set(CMAKE_SHARED_LIBRARY_PREFIX "") + set(CMAKE_SHARED_MODULE_PREFIX "") +endif() + option(BUILD_SHARED_LIBS "ggml: build shared libraries" ${BUILD_SHARED_LIBS_DEFAULT}) option(GGML_BACKEND_DL "ggml: build backends as dynamic libraries (requires BUILD_SHARED_LIBS)" OFF) diff --git a/ggml/src/CMakeLists.txt b/ggml/src/CMakeLists.txt index a267a8b59..349f4c57f 100644 --- a/ggml/src/CMakeLists.txt +++ b/ggml/src/CMakeLists.txt @@ -194,11 +194,6 @@ endif() if (WIN32) add_compile_definitions(_CRT_SECURE_NO_WARNINGS) - - if (BUILD_SHARED_LIBS) - # TODO: should not use this - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - endif() endif() # ggml diff --git a/ggml/src/ggml-cpu/amx/amx.cpp b/ggml/src/ggml-cpu/amx/amx.cpp index b9074cb3a..5ec5263ce 100644 --- a/ggml/src/ggml-cpu/amx/amx.cpp +++ b/ggml/src/ggml-cpu/amx/amx.cpp @@ -122,7 +122,7 @@ static const char * ggml_backend_amx_buffer_type_get_name(ggml_backend_buffer_ty } static ggml_backend_buffer_t ggml_backend_amx_buffer_type_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) { - void * data = aligned_alloc(TENSOR_ALIGNMENT, size); + void * data = ggml_aligned_malloc(size); if (data == NULL) { fprintf(stderr, "%s: failed to allocate buffer of size %zu\n", __func__, size); return NULL; diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index ea17d6077..52881737c 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -126,8 +126,7 @@ struct ggml_arm_arch_features_type { #endif #include - -#if !defined(__clang__) +#if defined(_MSC_VER) && !defined(__clang__) #define GGML_CACHE_ALIGN __declspec(align(GGML_CACHE_LINE)) typedef volatile LONG atomic_int; @@ -12945,7 +12944,7 @@ static thread_ret_t ggml_graph_compute_secondary_thread(void* data); #include "windows.h" // TODO: support > 64 CPUs -bool ggml_thread_apply_affinity(bool * mask) { +static bool ggml_thread_apply_affinity(bool * mask) { HANDLE h = GetCurrentThread(); uint64_t bitmask = 0ULL; diff --git a/ggml/src/ggml-impl.h b/ggml/src/ggml-impl.h index 00a1546a7..f961134ed 100644 --- a/ggml/src/ggml-impl.h +++ b/ggml/src/ggml-impl.h @@ -74,8 +74,8 @@ static inline int ggml_up(int n, int m) { // GGML_ATTRIBUTE_FORMAT(2, 3) -void ggml_log_internal (enum ggml_log_level level, const char * format, ...); -void ggml_log_callback_default(enum ggml_log_level level, const char * text, void * user_data); +GGML_API void ggml_log_internal (enum ggml_log_level level, const char * format, ...); +GGML_API void ggml_log_callback_default(enum ggml_log_level level, const char * text, void * user_data); #define GGML_LOG(...) ggml_log_internal(GGML_LOG_LEVEL_NONE , __VA_ARGS__) #define GGML_LOG_INFO(...) ggml_log_internal(GGML_LOG_LEVEL_INFO , __VA_ARGS__) @@ -304,8 +304,8 @@ struct ggml_cgraph ggml_graph_view(struct ggml_cgraph * cgraph, int i0, int i1); // Memory allocation -void * ggml_aligned_malloc(size_t size); -void ggml_aligned_free(void * ptr, size_t size); +GGML_API void * ggml_aligned_malloc(size_t size); +GGML_API void ggml_aligned_free(void * ptr, size_t size); // FP16 to FP32 conversion diff --git a/ggml/src/ggml-threading.h b/ggml/src/ggml-threading.h index ce975d880..dec2c8840 100644 --- a/ggml/src/ggml-threading.h +++ b/ggml/src/ggml-threading.h @@ -1,11 +1,13 @@ #pragma once +#include "ggml.h" + #ifdef __cplusplus extern "C" { #endif -void ggml_critical_section_start(void); -void ggml_critical_section_end(void); +GGML_API void ggml_critical_section_start(void); +GGML_API void ggml_critical_section_end(void); #ifdef __cplusplus } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f3b3908b1..2d3ea0994 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,3 @@ -# TODO: should not use this -if (WIN32) - if (BUILD_SHARED_LIBS) - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) - endif() -endif() - llama_add_compile_flags() # diff --git a/src/llama.cpp b/src/llama.cpp index cae3f76ad..49ef5b78a 100644 --- a/src/llama.cpp +++ b/src/llama.cpp @@ -1794,7 +1794,7 @@ private: DWORD bufLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL); if (!bufLen) { - ret = format("Win32 error code: %s", error_code); + ret = format("Win32 error code: %lx", error_code); } else { ret = lpMsgBuf; LocalFree(lpMsgBuf); @@ -2132,7 +2132,7 @@ struct llama_mmap { HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll"); // may fail on pre-Windows 8 systems - pPrefetchVirtualMemory = reinterpret_cast (GetProcAddress(hKernel32, "PrefetchVirtualMemory")); + pPrefetchVirtualMemory = (decltype(pPrefetchVirtualMemory))(void *) GetProcAddress(hKernel32, "PrefetchVirtualMemory"); if (pPrefetchVirtualMemory) { // advise the kernel to preload the mapped memory @@ -21577,7 +21577,7 @@ float * llama_get_embeddings_ith(struct llama_context * ctx, int32_t i) { throw std::runtime_error(format("negative index out of range [0, %d)", ctx->n_outputs)); } } else if ((size_t) i >= ctx->output_ids.size()) { - throw std::runtime_error(format("out of range [0, %lu)", ctx->output_ids.size())); + throw std::runtime_error(format("out of range [0, %zu)", ctx->output_ids.size())); } else { j = ctx->output_ids[i]; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 82373ff4e..daeed4564 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -84,38 +84,50 @@ llama_test(test-tokenizer-0 NAME test-tokenizer-0-qwen2 ARGS ${CMAKE llama_test(test-tokenizer-0 NAME test-tokenizer-0-refact ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-refact.gguf) llama_test(test-tokenizer-0 NAME test-tokenizer-0-starcoder ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-starcoder.gguf) -# build test-tokenizer-1-bpe target once and add many tests -add_executable(test-tokenizer-1-bpe test-tokenizer-1-bpe.cpp) -target_link_libraries(test-tokenizer-1-bpe PRIVATE common) -install(TARGETS test-tokenizer-1-bpe RUNTIME) -# TODO: disabled due to slowness -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-aquila ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-aquila.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-falcon ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-falcon.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-2 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-gpt-2.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-neox ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-gpt-neox.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-llama-bpe ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama-bpe.gguf --ignore-merges) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-mpt ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-mpt.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-refact ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-refact.gguf) -#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-starcoder ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-starcoder.gguf) +if (NOT WIN32) + # these tests are disabled on Windows because they use internal functions not exported with LLAMA_API + llama_target_and_test(test-sampling.cpp) + llama_target_and_test(test-grammar-parser.cpp) + llama_target_and_test(test-grammar-integration.cpp) + llama_target_and_test(test-llama-grammar.cpp) + # TODO: disabled on loongarch64 because the ggml-ci node lacks Python 3.8 + if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "loongarch64") + llama_target_and_test(test-json-schema-to-grammar.cpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) + target_include_directories(test-json-schema-to-grammar PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../examples/server) + endif() -# build test-tokenizer-1-spm target once and add many tests -add_executable(test-tokenizer-1-spm test-tokenizer-1-spm.cpp) -target_link_libraries(test-tokenizer-1-spm PRIVATE common) -install(TARGETS test-tokenizer-1-spm RUNTIME) -llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-llama-spm ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama-spm.gguf) -#llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-baichuan ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-baichuan.gguf) + # build test-tokenizer-1-bpe target once and add many tests + add_executable(test-tokenizer-1-bpe test-tokenizer-1-bpe.cpp) + target_link_libraries(test-tokenizer-1-bpe PRIVATE common) + install(TARGETS test-tokenizer-1-bpe RUNTIME) + + # TODO: disabled due to slowness + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-aquila ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-aquila.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-falcon ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-falcon.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-2 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-gpt-2.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-neox ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-gpt-neox.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-llama-bpe ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama-bpe.gguf --ignore-merges) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-mpt ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-mpt.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-refact ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-refact.gguf) + #llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-starcoder ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-starcoder.gguf) + + # build test-tokenizer-1-spm target once and add many tests + add_executable(test-tokenizer-1-spm test-tokenizer-1-spm.cpp) + target_link_libraries(test-tokenizer-1-spm PRIVATE common) + install(TARGETS test-tokenizer-1-spm RUNTIME) + + llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-llama-spm ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama-spm.gguf) + #llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-baichuan ARGS ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-baichuan.gguf) + + # llama_target_and_test(test-double-float.cpp) # SLOW +endif() -# llama_target_and_test(test-double-float.cpp) # SLOW llama_target_and_test(test-log.cpp) llama_target_and_test(test-arg-parser.cpp) -llama_target_and_test(test-sampling.cpp) llama_target_and_test(test-chat-template.cpp) -llama_target_and_test(test-grammar-parser.cpp) -llama_target_and_test(test-grammar-integration.cpp) -llama_target_and_test(test-llama-grammar.cpp) # llama_target_and_test(test-opt.cpp) # SLOW llama_target_and_test(test-backend-ops.cpp) @@ -130,11 +142,6 @@ if (NOT GGML_BACKEND_DL) llama_target_and_test(test-rope.cpp) endif() -# TODO: disabled on loongarch64 because the ggml-ci node lacks Python 3.8 -if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "loongarch64") - llama_target_and_test(test-json-schema-to-grammar.cpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) - target_include_directories(test-json-schema-to-grammar PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../examples/server) -endif() # dummy executable - not installed get_filename_component(TEST_TARGET test-c.c NAME_WE) From 8faa1d4dd42f6cb26088ce7f5bbca5996b921685 Mon Sep 17 00:00:00 2001 From: a3sh <38979186+A3shTnT@users.noreply.github.com> Date: Fri, 13 Dec 2024 02:09:50 +0800 Subject: [PATCH 006/372] CUDA: faster non-contiguous concat (#10760) * faster uncontiguous concat * Use a lambda to avoid code duplication Co-authored-by: Diego Devesa * Update ggml/src/ggml-cuda/concat.cu * add constexpr and static assert --------- Co-authored-by: Diego Devesa --- ggml/src/ggml-cuda/concat.cu | 53 ++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/ggml/src/ggml-cuda/concat.cu b/ggml/src/ggml-cuda/concat.cu index dac10ec36..2f42b8a95 100644 --- a/ggml/src/ggml-cuda/concat.cu +++ b/ggml/src/ggml-cuda/concat.cu @@ -94,7 +94,9 @@ static void concat_f32_cuda(const float * x, const float * y, float * dst, int n } // non-contiguous kernel (slow) -static __global__ void concat_f32_non_cont( +template +static __global__ void __launch_bounds__(CUDA_CONCAT_BLOCK_SIZE) + concat_f32_non_cont( const char * src0, const char * src1, char * dst, @@ -121,22 +123,28 @@ static __global__ void concat_f32_non_cont( uint64_t nb0, uint64_t nb1, uint64_t nb2, - uint64_t nb3, - int32_t dim) { + uint64_t nb3){ + static_assert(dim >= 0 && dim <= 3); + const int64_t i3 = blockIdx.z; const int64_t i2 = blockIdx.y; const int64_t i1 = blockIdx.x; - int64_t o[4] = {0, 0, 0, 0}; - o[dim] = dim == 0 ? ne00 : (dim == 1 ? ne01 : (dim == 2 ? ne02 : ne03)); - const float * x; - for (int i0 = threadIdx.x; i0 < ne0; i0 += blockDim.x) { + for (int64_t i0 = threadIdx.x; i0 < ne0; i0 += blockDim.x) { if (i0 < ne00 && i1 < ne01 && i2 < ne02 && i3 < ne03) { x = (const float *)(src0 + (i3 )*nb03 + (i2 )*nb02 + (i1 )*nb01 + (i0 )*nb00); } else { - x = (const float *)(src1 + (i3 - o[3])*nb13 + (i2 - o[2])*nb12 + (i1 - o[1])*nb11 + (i0 - o[0])*nb10); + if constexpr (dim == 0) { + x = (const float *) (src1 + i3 * nb13 + i2 * nb12 + i1 * nb11 + (i0 - ne00) * nb10); + } else if constexpr (dim == 1) { + x = (const float *) (src1 + i3 * nb13 + i2 * nb12 + (i1 - ne01) * nb11 + i0 * nb10); + } else if constexpr (dim == 2) { + x = (const float *) (src1 + i3 * nb13 + (i2 - ne02) * nb12 + i1 * nb11 + i0 * nb10); + } else if constexpr (dim == 3) { + x = (const float *) (src1 + (i3 - ne03) * nb13 + i2 * nb12 + i1 * nb11 + i0 * nb10); + } } float * y = (float *)(dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); @@ -182,15 +190,32 @@ void ggml_cuda_op_concat(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { } } else { dim3 grid_dim(dst->ne[1], dst->ne[2], dst->ne[3]); - concat_f32_non_cont<<>>( - (const char *)src0->data, - (const char *)src1->data, - ( char *)dst->data, + auto launch_kernel = [&](auto dim) { + concat_f32_non_cont<<>>( + (const char *) src0->data, (const char *) src1->data, (char *) dst->data, src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], src0->nb[0], src0->nb[1], src0->nb[2], src0->nb[3], src1->ne[0], src1->ne[1], src1->ne[2], src1->ne[3], src1->nb[0], src1->nb[1], src1->nb[2], src1->nb[3], - dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], - dst->nb[0], dst->nb[1], dst->nb[2], dst->nb[3], dim); + dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], + dst->nb[0], dst->nb[1], dst->nb[2], dst->nb[3]); + }; + switch (dim) { + case 0: + launch_kernel(std::integral_constant{}); + break; + case 1: + launch_kernel(std::integral_constant{}); + break; + case 2: + launch_kernel(std::integral_constant{}); + break; + case 3: + launch_kernel(std::integral_constant{}); + break; + default: + GGML_ABORT("Invalid dim: %d", dim); + break; + } } } From 274ec65af6e54039eb95cb44904af5c945dca1fa Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Thu, 12 Dec 2024 20:52:28 +0100 Subject: [PATCH 007/372] contrib : add ngxson as codeowner (#10804) --- CODEOWNERS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 88ab6de4f..adeba5395 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,5 @@ # collaborators can optionally add themselves here to indicate their availability for reviewing related PRs -ci/ @ggerganov +/ci/ @ggerganov +/.devops/ @ngxson +/examples/server/ @ngxson From adffa6ffd59997da59f62b72d2b79fc37e085e84 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Thu, 12 Dec 2024 22:53:05 +0100 Subject: [PATCH 008/372] common : improve -ctv -ctk CLI arguments (#10806) * common : improve ctv ctk cli argument * regenerate docs * even better approach * use std::vector --- common/arg.cpp | 51 ++++++++++++++++++++++++++++++++++----- common/common.cpp | 36 ++------------------------- common/common.h | 4 +-- examples/CMakeLists.txt | 1 + examples/server/README.md | 19 ++++++++------- 5 files changed, 60 insertions(+), 51 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index b27567f3b..39bc874c8 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -145,6 +145,35 @@ static void common_params_handle_model_default(common_params & params) { } } +const std::vector kv_cache_types = { + GGML_TYPE_F32, + GGML_TYPE_F16, + GGML_TYPE_BF16, + GGML_TYPE_Q8_0, + GGML_TYPE_Q4_0, + GGML_TYPE_Q4_1, + GGML_TYPE_IQ4_NL, + GGML_TYPE_Q5_0, + GGML_TYPE_Q5_1, +}; + +static ggml_type kv_cache_type_from_str(const std::string & s) { + for (const auto & type : kv_cache_types) { + if (ggml_type_name(type) == s) { + return type; + } + } + throw std::runtime_error("Unsupported cache type: " + s); +} + +static std::string get_all_kv_cache_types() { + std::ostringstream msg; + for (const auto & type : kv_cache_types) { + msg << ggml_type_name(type) << (&type == &kv_cache_types.back() ? "" : ", "); + } + return msg.str(); +} + // // CLI argument parsing functions // @@ -1174,18 +1203,28 @@ common_params_context common_params_parser_init(common_params & params, llama_ex ).set_env("LLAMA_ARG_NO_KV_OFFLOAD")); add_opt(common_arg( {"-ctk", "--cache-type-k"}, "TYPE", - string_format("KV cache data type for K (default: %s)", params.cache_type_k.c_str()), + string_format( + "KV cache data type for K\n" + "allowed values: %s\n" + "(default: %s)", + get_all_kv_cache_types().c_str(), + ggml_type_name(params.cache_type_k) + ), [](common_params & params, const std::string & value) { - // TODO: get the type right here - params.cache_type_k = value; + params.cache_type_k = kv_cache_type_from_str(value); } ).set_env("LLAMA_ARG_CACHE_TYPE_K")); add_opt(common_arg( {"-ctv", "--cache-type-v"}, "TYPE", - string_format("KV cache data type for V (default: %s)", params.cache_type_v.c_str()), + string_format( + "KV cache data type for V\n" + "allowed values: %s\n" + "(default: %s)", + get_all_kv_cache_types().c_str(), + ggml_type_name(params.cache_type_v) + ), [](common_params & params, const std::string & value) { - // TODO: get the type right here - params.cache_type_v = value; + params.cache_type_v = kv_cache_type_from_str(value); } ).set_env("LLAMA_ARG_CACHE_TYPE_V")); add_opt(common_arg( diff --git a/common/common.cpp b/common/common.cpp index 6143516d2..3cd43ecdf 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -1015,38 +1015,6 @@ struct llama_model_params common_model_params_to_llama(common_params & params) { return mparams; } -static ggml_type kv_cache_type_from_str(const std::string & s) { - if (s == "f32") { - return GGML_TYPE_F32; - } - if (s == "f16") { - return GGML_TYPE_F16; - } - if (s == "bf16") { - return GGML_TYPE_BF16; - } - if (s == "q8_0") { - return GGML_TYPE_Q8_0; - } - if (s == "q4_0") { - return GGML_TYPE_Q4_0; - } - if (s == "q4_1") { - return GGML_TYPE_Q4_1; - } - if (s == "iq4_nl") { - return GGML_TYPE_IQ4_NL; - } - if (s == "q5_0") { - return GGML_TYPE_Q5_0; - } - if (s == "q5_1") { - return GGML_TYPE_Q5_1; - } - - throw std::runtime_error("Unsupported cache type: " + s); -} - struct llama_context_params common_context_params_to_llama(const common_params & params) { auto cparams = llama_context_default_params(); @@ -1081,8 +1049,8 @@ struct llama_context_params common_context_params_to_llama(const common_params & cparams.pooling_type = LLAMA_POOLING_TYPE_RANK; } - cparams.type_k = kv_cache_type_from_str(params.cache_type_k); - cparams.type_v = kv_cache_type_from_str(params.cache_type_v); + cparams.type_k = params.cache_type_k; + cparams.type_v = params.cache_type_v; return cparams; } diff --git a/common/common.h b/common/common.h index 95d20401d..0481720ab 100644 --- a/common/common.h +++ b/common/common.h @@ -286,8 +286,8 @@ struct common_params { bool warmup = true; // warmup run bool check_tensors = false; // validate tensor data - std::string cache_type_k = "f16"; // KV cache data type for the K - std::string cache_type_v = "f16"; // KV cache data type for the V + ggml_type cache_type_k = GGML_TYPE_F16; // KV cache data type for the K + ggml_type cache_type_v = GGML_TYPE_F16; // KV cache data type for the V // multimodal models (see examples/llava) std::string mmproj = ""; // path to multimodal projector // NOLINT diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b2df4f2fb..21b31392e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -51,6 +51,7 @@ else() add_subdirectory(speculative) add_subdirectory(speculative-simple) add_subdirectory(tokenize) + add_subdirectory(gen-docs) if (NOT GGML_BACKEND_DL) # these examples use the backends directly and cannot be built with dynamic loading add_subdirectory(convert-llama2c-to-ggml) diff --git a/examples/server/README.md b/examples/server/README.md index 686be7baf..a9443e56b 100644 --- a/examples/server/README.md +++ b/examples/server/README.md @@ -62,8 +62,8 @@ The project is under active development, and we are [looking for feedback and co | `--yarn-beta-fast N` | YaRN: low correction dim or beta (default: 32.0)
(env: LLAMA_ARG_YARN_BETA_FAST) | | `-dkvc, --dump-kv-cache` | verbose print of the KV cache | | `-nkvo, --no-kv-offload` | disable KV offload
(env: LLAMA_ARG_NO_KV_OFFLOAD) | -| `-ctk, --cache-type-k TYPE` | KV cache data type for K (default: f16)
(env: LLAMA_ARG_CACHE_TYPE_K) | -| `-ctv, --cache-type-v TYPE` | KV cache data type for V (default: f16)
(env: LLAMA_ARG_CACHE_TYPE_V) | +| `-ctk, --cache-type-k TYPE` | KV cache data type for K
allowed values: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1
(default: f16)
(env: LLAMA_ARG_CACHE_TYPE_K) | +| `-ctv, --cache-type-v TYPE` | KV cache data type for V
allowed values: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1
(default: f16)
(env: LLAMA_ARG_CACHE_TYPE_V) | | `-dt, --defrag-thold N` | KV cache defragmentation threshold (default: 0.1, < 0 - disabled)
(env: LLAMA_ARG_DEFRAG_THOLD) | | `-np, --parallel N` | number of parallel sequences to decode (default: 1)
(env: LLAMA_ARG_N_PARALLEL) | | `--mlock` | force system to keep model in RAM rather than swapping or compressing
(env: LLAMA_ARG_MLOCK) | @@ -138,6 +138,7 @@ The project is under active development, and we are [looking for feedback and co | -------- | ----------- | | `--no-context-shift` | disables context shift on inifinite text generation (default: disabled)
(env: LLAMA_ARG_NO_CONTEXT_SHIFT) | | `-sp, --special` | special tokens output enabled (default: false) | +| `--no-warmup` | skip warming up the model with an empty run | | `--spm-infill` | use Suffix/Prefix/Middle pattern for infill (instead of Prefix/Suffix/Middle) as some models prefer this. (default: disabled) | | `--pooling {none,mean,cls,last,rank}` | pooling type for embeddings, use model default if unspecified
(env: LLAMA_ARG_POOLING) | | `-cb, --cont-batching` | enable continuous batching (a.k.a dynamic batching) (default: enabled)
(env: LLAMA_ARG_CONT_BATCHING) | @@ -146,7 +147,7 @@ The project is under active development, and we are [looking for feedback and co | `--host HOST` | ip address to listen (default: 127.0.0.1)
(env: LLAMA_ARG_HOST) | | `--port PORT` | port to listen (default: 8080)
(env: LLAMA_ARG_PORT) | | `--path PATH` | path to serve static files from (default: )
(env: LLAMA_ARG_STATIC_PATH) | -| `--no-webui` | disable the Web UI
(env: LLAMA_ARG_NO_WEBUI) | +| `--no-webui` | Disable the Web UI (default: enabled)
(env: LLAMA_ARG_NO_WEBUI) | | `--embedding, --embeddings` | restrict to only support embedding use case; use only with dedicated embedding models (default: disabled)
(env: LLAMA_ARG_EMBEDDINGS) | | `--reranking, --rerank` | enable reranking endpoint on server (default: disabled)
(env: LLAMA_ARG_RERANKING) | | `--api-key KEY` | API key to use for authentication (default: none)
(env: LLAMA_API_KEY) | @@ -164,13 +165,13 @@ The project is under active development, and we are [looking for feedback and co | `--chat-template JINJA_TEMPLATE` | set custom jinja chat template (default: template taken from model's metadata)
if suffix/prefix are specified, template will be disabled
list of built-in templates:
chatglm3, chatglm4, chatml, command-r, deepseek, deepseek2, exaone3, gemma, granite, llama2, llama2-sys, llama2-sys-bos, llama2-sys-strip, llama3, minicpm, mistral-v1, mistral-v3, mistral-v3-tekken, mistral-v7, monarch, openchat, orion, phi3, rwkv-world, vicuna, vicuna-orca, zephyr
(env: LLAMA_ARG_CHAT_TEMPLATE) | | `-sps, --slot-prompt-similarity SIMILARITY` | how much the prompt of a request must match the prompt of a slot in order to use that slot (default: 0.50, 0.0 = disabled)
| | `--lora-init-without-apply` | load LoRA adapters without applying them (apply later via POST /lora-adapters) (default: disabled) | -| `--draft-max, --draft, --draft-n N` | number of tokens to draft for speculative decoding (default: 16) | -| `--draft-min, --draft-n-min N` | minimum number of draft tokens to use for speculative decoding (default: 5) | -| `--draft-p-min P` | minimum speculative decoding probability (greedy) (default: 0.9) | -| `-cd, --ctx-size-draft N` | size of the prompt context for the draft model (default: 0, 0 = loaded from model) | +| `--draft-max, --draft, --draft-n N` | number of tokens to draft for speculative decoding (default: 16)
(env: LLAMA_ARG_DRAFT_MAX) | +| `--draft-min, --draft-n-min N` | minimum number of draft tokens to use for speculative decoding (default: 5)
(env: LLAMA_ARG_DRAFT_MIN) | +| `--draft-p-min P` | minimum speculative decoding probability (greedy) (default: 0.9)
(env: LLAMA_ARG_DRAFT_P_MIN) | +| `-cd, --ctx-size-draft N` | size of the prompt context for the draft model (default: 0, 0 = loaded from model)
(env: LLAMA_ARG_CTX_SIZE_DRAFT) | | `-devd, --device-draft ` | comma-separated list of devices to use for offloading the draft model (none = don't offload)
use --list-devices to see a list of available devices | -| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | number of layers to store in VRAM for the draft model | -| `-md, --model-draft FNAME` | draft model for speculative decoding (default: unused) | +| `-ngld, --gpu-layers-draft, --n-gpu-layers-draft N` | number of layers to store in VRAM for the draft model
(env: LLAMA_ARG_N_GPU_LAYERS_DRAFT) | +| `-md, --model-draft FNAME` | draft model for speculative decoding (default: unused)
(env: LLAMA_ARG_MODEL_DRAFT) | Note: If both command line argument and environment variable are both set for the same param, the argument will take precedence over env var. From d583cd03f663701858ba152a334cbb467fabe342 Mon Sep 17 00:00:00 2001 From: Karol Kontny <82021046+kkontny@users.noreply.github.com> Date: Fri, 13 Dec 2024 01:04:19 +0100 Subject: [PATCH 009/372] ggml : Fix compilation issues on ARM platform when building without fp16 (#10811) --- ggml/src/ggml-cpu/ggml-cpu.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 52881737c..92df6fdda 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -454,21 +454,21 @@ const struct ggml_type_traits_cpu * ggml_get_type_traits_cpu(enum ggml_type type #define GGML_F32x4_ADD vaddq_f32 #define GGML_F32x4_MUL vmulq_f32 #define GGML_F32x4_REDUCE_ONE(x) vaddvq_f32(x) -#define GGML_F32x4_REDUCE(res, x) \ -{ \ - int offset = GGML_F32_ARR >> 1; \ - for (int i = 0; i < offset; ++i) { \ - (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ - } \ - offset >>= 1; \ - for (int i = 0; i < offset; ++i) { \ - (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ - } \ - offset >>= 1; \ - for (int i = 0; i < offset; ++i) { \ - (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ - } \ - (res) = GGML_F32x4_REDUCE_ONE((x)[0]); \ +#define GGML_F32x4_REDUCE(res, x) \ +{ \ + int offset = GGML_F32_ARR >> 1; \ + for (int i = 0; i < offset; ++i) { \ + (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ + } \ + offset >>= 1; \ + for (int i = 0; i < offset; ++i) { \ + (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ + } \ + offset >>= 1; \ + for (int i = 0; i < offset; ++i) { \ + (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \ + } \ + (res) = (ggml_float) GGML_F32x4_REDUCE_ONE((x)[0]); \ } #define GGML_F32_VEC GGML_F32x4 @@ -2395,7 +2395,7 @@ static void ggml_init_arm_arch_features(void) { uint32_t hwcap2 = getauxval(AT_HWCAP2); ggml_arm_arch_features.has_neon = !!(hwcap & HWCAP_ASIMD); - ggml_arm_arch_features.has_dotprod = !!(hwcap && HWCAP_ASIMDDP); + ggml_arm_arch_features.has_dotprod = !!(hwcap & HWCAP_ASIMDDP); ggml_arm_arch_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM); ggml_arm_arch_features.has_sve = !!(hwcap & HWCAP_SVE); From 83ed24a97b500ccdb32b90b94e6f9621ad8db79e Mon Sep 17 00:00:00 2001 From: Akarshan Biswas Date: Fri, 13 Dec 2024 12:12:15 +0530 Subject: [PATCH 010/372] SYCL: Reduce most of the compiler warnings (#10748) * Try to reduce some unused and typecast warnings * Reduce compiler warnings step 2 * add a newline at the end of the file * Initialize nreduce as size_t * [SYCL] Remove pragma directives from mmq.cpp * SYCL: mmq add condition to prevent blocks_per_tile_x_row variable from becoming 0 * SYCL softmax: Initialize nreduce as size_t * ggml-sycl.cpp: fix some trailing whitespaces * SYCL: remove the unused variables instead of commenting it out * SYCL poo2d kernel: set NAN for invalid pooling op * SYCL gemm.hpp: remove pragma directives * SYCL gemm.hpp: use const cast to properly support dnnl::memory * SYCL: wkv6 remove a comment * SYCL: clean comments step 2 * SYCL: clean comments and variables step 3 * SYCL: Use GGML_UNUSED for unused variables * SYCL: remove extra empty lines and a comment * Remove TODO * cleanup spaces * add a stdout for unsupported op * use sycl printf over fprintf * remove prints for CI * SYCL ggml-sycl: pool2D use sycl::nan and remove if-else block --------- Co-authored-by: Abhilash Majumder <30946547+abhilash1910@users.noreply.github.com> --- ggml/src/ggml-sycl/common.cpp | 13 +-- ggml/src/ggml-sycl/common.hpp | 1 + ggml/src/ggml-sycl/concat.cpp | 4 +- ggml/src/ggml-sycl/convert.cpp | 2 +- ggml/src/ggml-sycl/dmmv.cpp | 10 +- ggml/src/ggml-sycl/dpct/helper.hpp | 2 +- ggml/src/ggml-sycl/element_wise.cpp | 141 ++++++++++++++++------------ ggml/src/ggml-sycl/gemm.hpp | 8 +- ggml/src/ggml-sycl/ggml-sycl.cpp | 134 ++++++++++++++------------ ggml/src/ggml-sycl/im2col.cpp | 5 +- ggml/src/ggml-sycl/mmq.cpp | 12 +-- ggml/src/ggml-sycl/mmvq.cpp | 26 ++--- ggml/src/ggml-sycl/norm.cpp | 7 +- ggml/src/ggml-sycl/rope.cpp | 7 +- ggml/src/ggml-sycl/softmax.cpp | 14 +-- ggml/src/ggml-sycl/tsembd.cpp | 1 + ggml/src/ggml-sycl/wkv6.cpp | 5 +- 17 files changed, 205 insertions(+), 187 deletions(-) diff --git a/ggml/src/ggml-sycl/common.cpp b/ggml/src/ggml-sycl/common.cpp index 97ab2003c..a9ee40491 100644 --- a/ggml/src/ggml-sycl/common.cpp +++ b/ggml/src/ggml-sycl/common.cpp @@ -11,6 +11,7 @@ // #include "common.hpp" +#include "ggml-impl.h" int get_current_device_id() { return dpct::dev_mgr::instance().current_device_id(); @@ -28,11 +29,7 @@ void* ggml_sycl_host_malloc(size_t size) try { if (err != 0) { // clear the error - fprintf( - stderr, - "WARNING: failed to allocate %.2f MB of pinned memory: %s\n", - size / 1024.0 / 1024.0, - "syclGetErrorString is not supported"); + GGML_LOG_ERROR("WARNING: failed to allocate %.2f MB of pinned memory: %s\n", size / 1024.0 / 1024.0, "syclGetErrorString is not supported"); return nullptr; } @@ -66,18 +63,12 @@ int64_t downsample_sycl_global_range(int64_t accumulate_block_num, int64_t block void ggml_sycl_op_flatten(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, ggml_tensor *dst, const ggml_sycl_op_flatten_t op) try { - const int64_t nrows0 = ggml_nrows(src0); const bool use_src1 = src1 != nullptr; - const int64_t nrows1 = use_src1 ? ggml_nrows(src1) : 1; GGML_ASSERT(!use_src1 || src1->backend != GGML_BACKEND_TYPE_GPU_SPLIT); GGML_ASSERT( dst->backend != GGML_BACKEND_TYPE_GPU_SPLIT); - ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; - ggml_tensor_extra_gpu * src1_extra = use_src1 ? (ggml_tensor_extra_gpu *) src1->extra : nullptr; - ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; - // dd = data device float * src0_ddf = (float *) src0->data; float * src1_ddf = use_src1 ? (float *) src1->data : nullptr; diff --git a/ggml/src/ggml-sycl/common.hpp b/ggml/src/ggml-sycl/common.hpp index 4549fa5e9..c1582f610 100644 --- a/ggml/src/ggml-sycl/common.hpp +++ b/ggml/src/ggml-sycl/common.hpp @@ -626,6 +626,7 @@ struct bin_bcast_sycl { }); } } + GGML_UNUSED(ctx); } }; diff --git a/ggml/src/ggml-sycl/concat.cpp b/ggml/src/ggml-sycl/concat.cpp index c90c452d8..a240968ad 100644 --- a/ggml/src/ggml-sycl/concat.cpp +++ b/ggml/src/ggml-sycl/concat.cpp @@ -47,7 +47,7 @@ static void concat_f32_dim1(const float *x, const float *y, float *dst, // operation int offset_dst = nidx + item_ct1.get_group(1) * ne0 + item_ct1.get_group(0) * ne0 * item_ct1.get_group_range(1); - if (item_ct1.get_group(1) < ne01) { // src0 + if (item_ct1.get_group(1) < (size_t) ne01) { // src0 int offset_src = nidx + item_ct1.get_group(1) * ne0 + item_ct1.get_group(0) * ne0 * ne01; dst[offset_dst] = x[offset_src]; @@ -70,7 +70,7 @@ static void concat_f32_dim2(const float *x, const float *y, float *dst, // operation int offset_dst = nidx + item_ct1.get_group(1) * ne0 + item_ct1.get_group(0) * ne0 * item_ct1.get_group_range(1); - if (item_ct1.get_group(0) < ne02) { // src0 + if (item_ct1.get_group(0) < (size_t) ne02) { // src0 int offset_src = nidx + item_ct1.get_group(1) * ne0 + item_ct1.get_group(0) * ne0 * item_ct1.get_group_range(1); dst[offset_dst] = x[offset_src]; diff --git a/ggml/src/ggml-sycl/convert.cpp b/ggml/src/ggml-sycl/convert.cpp index 5fd15e6cd..05b01db2d 100644 --- a/ggml/src/ggml-sycl/convert.cpp +++ b/ggml/src/ggml-sycl/convert.cpp @@ -424,7 +424,7 @@ static void convert_unary(const void * __restrict__ vx, dst_t * __restrict__ y, const int64_t global_id = item_ct1.get_local_id(2) + work_group_size * item_ct1.get_group(2); // make each work-item deal with more elements since sycl global range can not exceed max int - const src_t * x = (src_t *) vx; + const src_t * x = (const src_t *) vx; for (int64_t i = global_id; i < k; i += work_group_size * item_ct1.get_group_range(2)) { y[i] = x[i]; } diff --git a/ggml/src/ggml-sycl/dmmv.cpp b/ggml/src/ggml-sycl/dmmv.cpp index 0c3dfaa37..0d097357c 100644 --- a/ggml/src/ggml-sycl/dmmv.cpp +++ b/ggml/src/ggml-sycl/dmmv.cpp @@ -1015,9 +1015,9 @@ void ggml_sycl_op_dequantize_mul_mat_vec( break; } - (void) src1; - (void) dst; - (void) src1_ddq_i; - (void) src1_ncols; - (void) src1_padded_row_size; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_ddq_i); + GGML_UNUSED(src1_ncols); + GGML_UNUSED(src1_padded_row_size); } diff --git a/ggml/src/ggml-sycl/dpct/helper.hpp b/ggml/src/ggml-sycl/dpct/helper.hpp index d1b5dd87c..e167948e7 100644 --- a/ggml/src/ggml-sycl/dpct/helper.hpp +++ b/ggml/src/ggml-sycl/dpct/helper.hpp @@ -1237,7 +1237,7 @@ namespace dpct std::map::iterator get_map_iterator(const void *ptr) { - auto it = m_map.upper_bound((byte_t *)ptr); + auto it = m_map.upper_bound(const_cast(reinterpret_cast(ptr))); if (it == m_map.end()) { // Not a virtual pointer. diff --git a/ggml/src/ggml-sycl/element_wise.cpp b/ggml/src/ggml-sycl/element_wise.cpp index e5cd736eb..d05a51f80 100644 --- a/ggml/src/ggml-sycl/element_wise.cpp +++ b/ggml/src/ggml-sycl/element_wise.cpp @@ -237,7 +237,7 @@ void upscale_f32(const float *x, float *dst, const int nb00, const int nb01, int i02 = i12 / sf2; int i03 = i13 / sf3; - dst[index] = *(float *)((char *)x + i03 * nb03 + i02 * nb02 + i01 * nb01 + i00 * nb00); + dst[index] = *(const float *)((const char *)x + i03 * nb03 + i02 * nb02 + i01 * nb01 + i00 * nb00); } void pad_f32(const float *x, float *dst, const int ne0, const int ne00, const int ne01, const int ne02, @@ -251,8 +251,7 @@ void pad_f32(const float *x, float *dst, const int ne0, const int ne00, const i // operation int offset_dst = nidx + item_ct1.get_group(1) * ne0 + item_ct1.get_group(0) * ne0 * item_ct1.get_group_range(1); - if (nidx < ne00 && item_ct1.get_group(1) < ne01 && - item_ct1.get_group(0) < ne02) { + if (nidx < ne00 && item_ct1.get_group(1) < (size_t) ne01 && item_ct1.get_group(0) < (size_t) ne02) { int offset_src = nidx + item_ct1.get_group(1) * ne00 + item_ct1.get_group(0) * ne00 * ne01; dst[offset_dst] = x[offset_src]; @@ -520,9 +519,10 @@ inline void ggml_sycl_op_silu(ggml_backend_sycl_context & ctx, const ggml_tensor silu_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_gelu(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -535,9 +535,10 @@ inline void ggml_sycl_op_gelu(ggml_backend_sycl_context & ctx, const ggml_tensor gelu_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_gelu_quick(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, ggml_tensor *dst, @@ -550,9 +551,10 @@ inline void ggml_sycl_op_gelu_quick(ggml_backend_sycl_context & ctx, const ggml_ gelu_quick_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_tanh(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -564,9 +566,10 @@ inline void ggml_sycl_op_tanh(ggml_backend_sycl_context & ctx, const ggml_tensor GGML_ASSERT( dst->type == GGML_TYPE_F32); tanh_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_relu(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -579,9 +582,10 @@ inline void ggml_sycl_op_relu(ggml_backend_sycl_context & ctx, const ggml_tensor relu_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_hardsigmoid(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -595,9 +599,10 @@ inline void ggml_sycl_op_hardsigmoid(ggml_backend_sycl_context & ctx, const ggml hardsigmoid_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_hardswish(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -610,9 +615,10 @@ inline void ggml_sycl_op_hardswish(ggml_backend_sycl_context & ctx, const ggml_t hardswish_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_exp(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -625,9 +631,10 @@ inline void ggml_sycl_op_exp(ggml_backend_sycl_context & ctx, const ggml_tensor exp_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_log(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -640,9 +647,10 @@ inline void ggml_sycl_op_log(ggml_backend_sycl_context & ctx, const ggml_tensor log_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sigmoid(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -655,9 +663,10 @@ inline void ggml_sycl_op_sigmoid(ggml_backend_sycl_context & ctx, const ggml_ten sigmoid_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sqrt(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -670,9 +679,10 @@ inline void ggml_sycl_op_sqrt(ggml_backend_sycl_context & ctx, const ggml_tensor sqrt_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sin(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -685,9 +695,10 @@ inline void ggml_sycl_op_sin(ggml_backend_sycl_context & ctx, const ggml_tensor sin_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_cos(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -700,9 +711,10 @@ inline void ggml_sycl_op_cos(ggml_backend_sycl_context & ctx, const ggml_tensor cos_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_step(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -715,9 +727,10 @@ inline void ggml_sycl_op_step(ggml_backend_sycl_context & ctx, const ggml_tensor step_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_neg(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -730,9 +743,10 @@ inline void ggml_sycl_op_neg(ggml_backend_sycl_context & ctx, const ggml_tensor neg_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_leaky_relu(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -749,9 +763,10 @@ inline void ggml_sycl_op_leaky_relu(ggml_backend_sycl_context & ctx, const ggml_ leaky_relu_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), negative_slope, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sqr(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -764,9 +779,10 @@ inline void ggml_sycl_op_sqr(ggml_backend_sycl_context & ctx, const ggml_tensor sqr_f32_sycl(src0_dd, dst_dd, ggml_nelements(src0), main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_upscale(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -787,9 +803,10 @@ inline void ggml_sycl_op_upscale(ggml_backend_sycl_context & ctx, const ggml_ten dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], sf0, sf1, sf2, sf3, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_pad(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -805,9 +822,10 @@ inline void ggml_sycl_op_pad(ggml_backend_sycl_context & ctx, const ggml_tensor src0->ne[0], src0->ne[1], src0->ne[2], dst->ne[0], dst->ne[1], dst->ne[2], main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_acc(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -827,7 +845,8 @@ inline void ggml_sycl_op_acc(ggml_backend_sycl_context & ctx, const ggml_tensor acc_f32_sycl(src0_dd, src1_dd, dst_dd, ggml_nelements(dst), src1->ne[0], src1->ne[1], src1->ne[2], nb1, nb2, offset, main_stream); - (void) dst; + GGML_UNUSED(dst); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_add(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, diff --git a/ggml/src/ggml-sycl/gemm.hpp b/ggml/src/ggml-sycl/gemm.hpp index 2ad9b36f4..3f0f34ad6 100644 --- a/ggml/src/ggml-sycl/gemm.hpp +++ b/ggml/src/ggml-sycl/gemm.hpp @@ -51,8 +51,8 @@ public: const auto a_in_md = dnnl::memory::desc(a_dims, at, a_trans ? tag::ba : tag::ab); const auto b_in_md = dnnl::memory::desc(b_dims, bt, b_trans ? tag::ba : tag::ab); const auto c_md = dnnl::memory::desc(c_dims, ct, tag::ab); - auto a_mem = dnnl::memory(a_in_md, eng, (void*)a); - auto b_mem = dnnl::memory(b_in_md, eng, (void*)b); + auto a_mem = dnnl::memory(a_in_md, eng, const_cast(a)); + auto b_mem = dnnl::memory(b_in_md, eng, const_cast(b)); auto matmul_pd = dnnl::matmul::primitive_desc(eng, a_in_md, b_in_md, c_md); auto c_mem = dnnl::memory(matmul_pd.dst_desc(), eng, c); @@ -79,8 +79,8 @@ public: const auto a_in_md = dnnl::memory::desc(a_dims, at, a_trans ? tag::ba : tag::ab); const auto b_in_md = dnnl::memory::desc(b_dims, bt, b_trans ? tag::ba : tag::ab); const auto c_md = dnnl::memory::desc(c_dims, ct, tag::ab); - auto a_mem = dnnl::memory(a_in_md, eng, (void*)a); - auto b_mem = dnnl::memory(b_in_md, eng, (void*)b); + auto a_mem = dnnl::memory(a_in_md, eng, const_cast(a)); + auto b_mem = dnnl::memory(b_in_md, eng, const_cast(b)); auto matmul_pd = dnnl::matmul::primitive_desc(eng, a_in_md, b_in_md, c_md); auto c_mem = dnnl::memory(matmul_pd.dst_desc(), eng, c); diff --git a/ggml/src/ggml-sycl/ggml-sycl.cpp b/ggml/src/ggml-sycl/ggml-sycl.cpp index ae3baedc7..6b9f0b0d9 100644 --- a/ggml/src/ggml-sycl/ggml-sycl.cpp +++ b/ggml/src/ggml-sycl/ggml-sycl.cpp @@ -47,7 +47,7 @@ static ggml_sycl_device_info ggml_sycl_init() { info.device_count = dpct::dev_mgr::instance().device_count(); if (info.device_count == 0) { - GGML_LOG_ERROR("%s: failed to initialize " GGML_SYCL_NAME ": %s\n", __func__); + GGML_LOG_ERROR("%s: failed to initialize: %s\n", GGML_SYCL_NAME, __func__); return info; } @@ -64,7 +64,7 @@ static ggml_sycl_device_info ggml_sycl_init() { #else GGML_LOG_INFO("%s: SYCL_USE_XMX: no\n", __func__); #endif - GGML_LOG_INFO("%s: found %d " GGML_SYCL_NAME " devices:\n", __func__, info.device_count); + GGML_LOG_INFO("%s: found %d %s devices:\n", __func__, info.device_count, GGML_SYCL_NAME); for (int i = 0; i < info.device_count; ++i) { info.devices[i].vmm = 0; @@ -137,7 +137,6 @@ void ggml_backend_sycl_print_sycl_devices() { for (int id = 0; id < device_count; ++id) { sycl::device device = dpct::dev_mgr::instance().get_device(id); - sycl::backend backend = device.get_backend(); std::string backend_type = get_device_backend_and_type(device); int type_id = DeviceNums[backend_type]++; std::stringstream device_type; @@ -420,13 +419,11 @@ ggml_backend_sycl_buffer_cpy_tensor(ggml_backend_buffer_t buffer, return true; } return false; + GGML_UNUSED(buffer); +} catch (const sycl::exception & exc) { + std::cerr << exc.what() << "Exception caught at file:" << __FILE__ << ", line:" << __LINE__ << std::endl; + std::exit(1); } -catch (sycl::exception const &exc) { - std::cerr << exc.what() << "Exception caught at file:" << __FILE__ - << ", line:" << __LINE__ << std::endl; - std::exit(1); -} - static void ggml_backend_sycl_buffer_clear(ggml_backend_buffer_t buffer, uint8_t value) try { @@ -1092,10 +1089,7 @@ struct ggml_sycl_pool_leg : public ggml_sycl_pool { ggml_sycl_buffer buffer_pool[MAX_SYCL_BUFFERS] = {}; size_t pool_size = 0; - explicit ggml_sycl_pool_leg(queue_ptr qptr_, int device_) : - qptr(qptr_), - device(device_) { - } + explicit ggml_sycl_pool_leg(queue_ptr qptr_, int device_) : device(device_), qptr(qptr_) {} ~ggml_sycl_pool_leg() { for (int i = 0; i < MAX_SYCL_BUFFERS; ++i) { @@ -1238,7 +1232,7 @@ static void quantize_q8_1(const float * __restrict__ x, void * __restrict__ vy, zeros[i] = 0.f; qzeros[i] = 0; } - const TC xi = ix < kx ? *(TC *)&x[iy * kx + ix] : zeros; + const TC xi = ix < kx ? *(const TC *)&x[iy * kx + ix] : zeros; float sum = xi[0]; float amax = sycl::fabs(xi[0]); #pragma unroll @@ -1799,6 +1793,9 @@ static void pool2d_nchw_kernel( switch (op) { case GGML_OP_POOL_AVG: res = 0; break; case GGML_OP_POOL_MAX: res = -FLT_MAX; break; + default: + res = (To) sycl::nan(uint32_t(0)); + break; } for (int i = bh; i < eh; i += 1) { @@ -1817,6 +1814,9 @@ static void pool2d_nchw_kernel( switch (op) { case GGML_OP_POOL_AVG: res += (cur / (kh * kw)); break; case GGML_OP_POOL_MAX: res = sycl::max(res, (To)cur); break; + default: + res = (To) sycl::nan(uint32_t(0)); + break; } } } @@ -1855,7 +1855,8 @@ static void get_rows_sycl(ggml_backend_sycl_context & ctx, const ggml_tensor *sr s3, nb01, nb02, nb03, s10, s11, s12, item_ct1); }); - (void) dst; + GGML_UNUSED(dst); + GGML_UNUSED(ctx); } template @@ -1893,10 +1894,10 @@ static void get_rows_sycl_float(ggml_backend_sycl_context & ctx, const ggml_tens }); } - (void) dst; + GGML_UNUSED(dst); + GGML_UNUSED(ctx); } - static void quantize_row_q8_1_sycl(const float *x, void *vy, const int kx, const int ky, const int kx_padded, queue_ptr stream) { @@ -2464,8 +2465,8 @@ static void ggml_sycl_op_repeat(ggml_backend_sycl_context & ctx, const ggml_tens ggml_sycl_op_bin_bcast>(ctx, dst, src0, dst, nullptr, src0_d, dst_d, main_stream); - (void) src1; - (void) src1_d; + GGML_UNUSED(src1); + GGML_UNUSED(src1_d); } @@ -2484,17 +2485,18 @@ inline void ggml_sycl_op_mul_mat_sycl( const int64_t ne00 = src0->ne[0]; const int64_t ne10 = src1->ne[0]; - const int64_t ne0 = dst->ne[0]; const int64_t row_diff = row_high - row_low; int id; SYCL_CHECK( CHECK_TRY_ERROR(id = get_current_device_id())); - +#if !GGML_SYCL_DNNL + const int64_t ne0 = dst->ne[0]; // the main device has a larger memory buffer to hold the results from all GPUs // ldc == nrows of the matrix that cuBLAS writes into int ldc = id == ctx.device ? ne0 : row_diff; +#endif #ifdef GGML_SYCL_F16 bool use_fp16 = true; // TODO(Yu) SYCL capability check @@ -2531,9 +2533,9 @@ inline void ggml_sycl_op_mul_mat_sycl( : src1_as_f16.get(); ggml_sycl_pool_alloc dst_f16(ctx.pool(), row_diff * src1_ncols); - const sycl::half alpha_f16 = 1.0f; - const sycl::half beta_f16 = 0.0f; #if !GGML_SYCL_DNNL + const sycl::half alpha_f16 = 1.0f; + const sycl::half beta_f16 = 0.0f; SYCL_CHECK(CHECK_TRY_ERROR(dpct::gemm( *stream, oneapi::mkl::transpose::trans, oneapi::mkl::transpose::nontrans, row_diff, src1_ncols, ne10, @@ -2570,9 +2572,9 @@ inline void ggml_sycl_op_mul_mat_sycl( const float * src0_ddf_i = src0->type == GGML_TYPE_F32 ? (const float *) src0_dd_i : src0_ddq_as_f32.get(); const float * src1_ddf1_i = src1->type == GGML_TYPE_F32 ? (const float *) src1_ddf_i : src1_ddq_as_f32.get(); - const float alpha = 1.0f; - const float beta = 0.0f; #if !GGML_SYCL_DNNL + const float alpha = 1.0f; + const float beta = 0.0f; # ifdef GGML_SYCL_NVIDIA SYCL_CHECK(CHECK_TRY_ERROR(oneapi::mkl::blas::column_major::gemm( oneapi::mkl::backend_selector{ *stream }, oneapi::mkl::transpose::trans, @@ -2590,9 +2592,9 @@ inline void ggml_sycl_op_mul_mat_sycl( src0_ddf_i, DnnlGemmWrapper::to_dt(), dst_dd_i, DnnlGemmWrapper::to_dt()); #endif } - (void) dst; - (void) src1_ddq_i; - (void) src1_padded_row_size; + GGML_UNUSED(dst); + GGML_UNUSED(src1_ddq_i); + GGML_UNUSED(src1_padded_row_size); } catch (sycl::exception const &exc) { std::cerr << exc.what() << "Exception caught at file:" << __FILE__ @@ -2638,8 +2640,9 @@ static void ggml_sycl_op_pool2d(ggml_backend_sycl_context & ctx, const ggml_tens item_ct1); }); - (void) src1; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sum(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -2654,9 +2657,10 @@ inline void ggml_sycl_op_sum(ggml_backend_sycl_context & ctx, const ggml_tensor sum_rows_f32_sycl(src0_dd, dst_dd, ne, 1, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_sum_rows(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -2673,9 +2677,10 @@ inline void ggml_sycl_op_sum_rows(ggml_backend_sycl_context & ctx, const ggml_te sum_rows_f32_sycl(src0_dd, dst_dd, ncols, nrows, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_argsort(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -2694,9 +2699,10 @@ inline void ggml_sycl_op_argsort(ggml_backend_sycl_context & ctx, const ggml_ten argsort_f32_i32_sycl(src0_dd, (int *)dst_dd, ncols, nrows, order, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_argmax(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -2713,9 +2719,10 @@ inline void ggml_sycl_op_argmax(ggml_backend_sycl_context & ctx, const ggml_tens argmax_f32_i32_sycl(src0_dd, (int *)dst_dd, ncols, nrows, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_diag_mask_inf(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, @@ -2735,9 +2742,10 @@ inline void ggml_sycl_op_diag_mask_inf(ggml_backend_sycl_context & ctx, const gg diag_mask_inf_f32_sycl(src0_dd, dst_dd, ne00, nrows0, ne01, n_past, main_stream); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_scale(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -2758,9 +2766,10 @@ inline void ggml_sycl_op_scale(ggml_backend_sycl_context & ctx, const ggml_tenso */ SYCL_CHECK(0); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } inline void ggml_sycl_op_clamp(ggml_backend_sycl_context & ctx, const ggml_tensor *src0, const ggml_tensor *src1, @@ -2783,9 +2792,10 @@ inline void ggml_sycl_op_clamp(ggml_backend_sycl_context & ctx, const ggml_tenso */ SYCL_CHECK(0); - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } static void ggml_sycl_set_peer_access(const int n_tokens, int main_device) { @@ -2862,7 +2872,6 @@ static void ggml_sycl_op_mul_mat(ggml_backend_sycl_context & ctx, const ggml_ten ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; - ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; const bool src0_is_contiguous = ggml_is_contiguous(src0); const bool src1_is_contiguous = ggml_is_contiguous(src1); @@ -3289,7 +3298,6 @@ static void ggml_sycl_mul_mat_batched_sycl(ggml_backend_sycl_context & ctx, GGML_TENSOR_BINARY_OP_LOCALS - const int64_t ne_dst = ggml_nelements(dst); SYCL_CHECK(ggml_sycl_set_device(ctx.device)); queue_ptr main_stream = ctx.stream();; @@ -3397,6 +3405,7 @@ catch (sycl::exception const &exc) { inline bool ggml_sycl_supports_mmq(enum ggml_type type) { // TODO: accuracy issues in MMQ + GGML_UNUSED(type); return false; } @@ -3772,7 +3781,7 @@ static void ggml_sycl_cpy(ggml_backend_sycl_context & ctx, const ggml_tensor *sr GGML_ABORT("fatal error"); } - (void) dst; + GGML_UNUSED(dst); } catch (sycl::exception const &exc) { std::cerr << exc.what() << "Exception caught at file:" << __FILE__ @@ -3783,7 +3792,7 @@ catch (sycl::exception const &exc) { static void ggml_sycl_dup(ggml_backend_sycl_context & ctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { // TODO: why do we pass dst as src1 here? ggml_sycl_cpy(ctx, src0, dst, nullptr); - (void) src1; + GGML_UNUSED(src1); } static void ggml_sycl_diag_mask_inf(ggml_backend_sycl_context & ctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { @@ -3828,13 +3837,16 @@ static void ggml_sycl_argmax(ggml_backend_sycl_context & ctx, const ggml_tensor } static void ggml_sycl_nop(ggml_backend_sycl_context & ctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { - (void) src0; - (void) src1; - (void) dst; + GGML_UNUSED(src0); + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(ctx); } void ggml_sycl_set_main_device(const int main_device) try { - if (dpct::get_current_device_id() == main_device) return; + if (dpct::get_current_device_id() == static_cast (main_device)) { + return; + } check_allow_gpu_index(main_device); dpct::select_device(main_device); @@ -4202,6 +4214,7 @@ try { ggml_backend_sycl_context *sycl_ctx = (ggml_backend_sycl_context *)backend->context; + sycl::event *sycl_event = static_cast(event->context); const queue_ptr &stream = sycl_ctx->stream(sycl_ctx->device, 0); @@ -4216,7 +4229,7 @@ catch (sycl::exception const &exc) } static void ggml_backend_sycl_event_wait(ggml_backend_t backend, ggml_backend_event_t event) try { - ggml_backend_sycl_context* sycl_ctx = static_cast(backend->context); + sycl::event* sycl_event = static_cast(event->context); if (ggml_backend_is_sycl(backend)) { @@ -4624,6 +4637,7 @@ static void *ggml_backend_sycl_reg_get_proc_address(ggml_backend_reg_t reg, cons // SYCL doesn't support registering host memory, left here for reference // "ggml_backend_register_host_buffer" // "ggml_backend_unregister_host_buffer" + GGML_UNUSED(name); return nullptr; } diff --git a/ggml/src/ggml-sycl/im2col.cpp b/ggml/src/ggml-sycl/im2col.cpp index 6a0a0fcd0..6146a99ed 100644 --- a/ggml/src/ggml-sycl/im2col.cpp +++ b/ggml/src/ggml-sycl/im2col.cpp @@ -120,6 +120,7 @@ void ggml_sycl_op_im2col( im2col_sycl(src1_dd, (float *)dst_dd, IW, IH, OW, OH, KW, KH, IC, batch, batch_offset, delta_offset, s0, s1, p0, p1, d0, d1, main_stream); } - (void) src0; - (void) src0_dd; + GGML_UNUSED(src0); + GGML_UNUSED(src0_dd); + GGML_UNUSED(ctx); } diff --git a/ggml/src/ggml-sycl/mmq.cpp b/ggml/src/ggml-sycl/mmq.cpp index e952533d3..8ea82c940 100644 --- a/ggml/src/ggml-sycl/mmq.cpp +++ b/ggml/src/ggml-sycl/mmq.cpp @@ -813,7 +813,7 @@ load_tiles_q4_K(const void *__restrict__ vx, int *__restrict__ x_ql, x_ql[i * (WARP_SIZE + 1) + k] = get_int_from_uint8_aligned(bxi->qs, kqsx); } - const int blocks_per_tile_x_row = WARP_SIZE / QI4_K; // == 1 if QK_K == 256 + constexpr int blocks_per_tile_x_row = QI4_K > WARP_SIZE ? 1 : WARP_SIZE / QI4_K; // == 1 if QK_K == 256 const int kbxd = k % blocks_per_tile_x_row; // == 0 if QK_K == 256 #pragma unroll @@ -961,7 +961,7 @@ load_tiles_q5_K(const void *__restrict__ vx, int *__restrict__ x_ql, x_ql[i * (2*WARP_SIZE + 1) + kq1] = ql1 | qh1; } - const int blocks_per_tile_x_row = WARP_SIZE / QI5_K; // == 1 if QK_K == 256 + constexpr int blocks_per_tile_x_row = QI5_K > WARP_SIZE ? 1 : WARP_SIZE / QI5_K; // == 1 if QK_K == 256 const int kbxd = k % blocks_per_tile_x_row; // == 0 if QK_K == 256 #pragma unroll @@ -1109,7 +1109,7 @@ load_tiles_q6_K(const void *__restrict__ vx, int *__restrict__ x_ql, dpct::sub_sat()); } - const int blocks_per_tile_x_row = WARP_SIZE / QI6_K; // == 1 if QK_K == 256 + constexpr int blocks_per_tile_x_row = QI6_K > WARP_SIZE ? 1 : WARP_SIZE / QI6_K; // == 1 if QK_K == 256 const int kbxd = k % blocks_per_tile_x_row; // == 0 if QK_K == 256 float * x_dmf = (float *) x_dm; @@ -3020,9 +3020,9 @@ void ggml_sycl_op_mul_mat_q( break; } - (void) src1; - (void) dst; - (void) src1_ddf_i; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_ddf_i); } catch (sycl::exception const &exc) { std::cerr << exc.what() << "Exception caught at file:" << __FILE__ diff --git a/ggml/src/ggml-sycl/mmvq.cpp b/ggml/src/ggml-sycl/mmvq.cpp index 7b10cf688..221f65c21 100644 --- a/ggml/src/ggml-sycl/mmvq.cpp +++ b/ggml/src/ggml-sycl/mmvq.cpp @@ -753,11 +753,7 @@ static void mul_mat_vec_iq2_xs_q8_1_sycl(const void *vx, const void *vy, const sycl::range<3> block_nums(1, 1, block_num_y); const sycl::range<3> block_dims(1, GGML_SYCL_MMV_Y, QK_WARP_SIZE); { - - stream->submit([&](sycl::handler &cgh) { - auto iq2xs_grid_ptr_ct1 = &iq2xs_grid[0]; - auto ksigns64_ptr_ct1 = &ksigns64[0]; - + stream->submit([&](sycl::handler & cgh) { cgh.parallel_for( sycl::nd_range<3>(block_nums * block_dims, block_dims), [=](sycl::nd_item<3> item_ct1) @@ -780,9 +776,6 @@ static void mul_mat_vec_iq2_s_q8_1_sycl(const void *vx, const void *vy, { stream->submit([&](sycl::handler &cgh) { - auto iq2xs_grid_ptr_ct1 = &iq2xs_grid[0]; - auto ksigns64_ptr_ct1 = &ksigns64[0]; - cgh.parallel_for( sycl::nd_range<3>(block_nums * block_dims, block_dims), [=](sycl::nd_item<3> item_ct1) @@ -805,9 +798,6 @@ static void mul_mat_vec_iq3_xxs_q8_1_sycl(const void *vx, const void *vy, { stream->submit([&](sycl::handler &cgh) { - auto iq3xxs_grid_ptr_ct1 = &iq3xxs_grid[0]; - auto ksigns64_ptr_ct1 = &ksigns64[0]; - cgh.parallel_for( sycl::nd_range<3>(block_nums * block_dims, block_dims), [=](sycl::nd_item<3> item_ct1) @@ -830,8 +820,6 @@ static void mul_mat_vec_iq3_s_q8_1_sycl(const void *vx, const void *vy, { stream->submit([&](sycl::handler &cgh) { - auto iq3s_grid_ptr_ct1 = &iq3s_grid[0]; - cgh.parallel_for( sycl::nd_range<3>(block_nums * block_dims, block_dims), [=](sycl::nd_item<3> item_ct1) @@ -854,9 +842,6 @@ static void mul_mat_vec_iq1_s_q8_1_sycl(const void *vx, const void *vy, { stream->submit([&](sycl::handler &cgh) { - auto iq1s_grid_ptr_ct1 = &iq1s_grid_gpu[0]; - auto ksigns64_ptr_ct1 = &ksigns64[0]; - cgh.parallel_for( sycl::nd_range<3>(block_nums * block_dims, block_dims), [=](sycl::nd_item<3> item_ct1) @@ -954,7 +939,7 @@ void ggml_sycl_op_mul_mat_vec_q( const size_t q8_1_bs = QK8_1; // the main device has a larger memory buffer to hold the results from all GPUs // nrows_dst == nrows of the matrix that the kernel writes into - const int64_t nrows_dst = id == ctx.device ? ne00 : row_diff; + for (int i = 0; i < src1_ncols; i++) { const size_t src1_ddq_i_offset = i * src1_padded_col_size * q8_1_ts / q8_1_bs; @@ -1023,7 +1008,8 @@ void ggml_sycl_op_mul_mat_vec_q( break; } } - (void) src1; - (void) dst; - (void) src1_ddf_i; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_ddf_i); + GGML_UNUSED(ctx); } diff --git a/ggml/src/ggml-sycl/norm.cpp b/ggml/src/ggml-sycl/norm.cpp index 72d8fdb87..9cf2be155 100644 --- a/ggml/src/ggml-sycl/norm.cpp +++ b/ggml/src/ggml-sycl/norm.cpp @@ -31,7 +31,7 @@ static void norm_f32(const float* x, float* dst, const int ncols, const float ep */ item_ct1.barrier(sycl::access::fence_space::local_space); mean_var = 0.f; - int nreduce = nwarps / WARP_SIZE; + size_t nreduce = nwarps / WARP_SIZE; for (size_t i = 0; i < nreduce; i += 1) { mean_var += s_sum[lane_id + i * WARP_SIZE]; @@ -55,7 +55,7 @@ static void group_norm_f32(const float* x, float* dst, const int group_size, con const int nthreads = item_ct1.get_local_range(2); const int nwarps = nthreads / WARP_SIZE; start += item_ct1.get_local_id(2); - int nreduce = nwarps / WARP_SIZE; + size_t nreduce = nwarps / WARP_SIZE; if (end >= ne_elements) { end = ne_elements; @@ -163,7 +163,7 @@ static void rms_norm_f32(const float* x, float* dst, const int ncols, const floa converged control flow. You may need to adjust the code. */ item_ct1.barrier(sycl::access::fence_space::local_space); - int nreduce = nwarps / WARP_SIZE; + size_t nreduce = nwarps / WARP_SIZE; tmp = 0.f; for (size_t i = 0; i < nreduce; i += 1) { @@ -352,6 +352,7 @@ void ggml_sycl_op_group_norm(ggml_backend_sycl_context& ctx, const ggml_tensor* (void)src1; (void)dst; (void)src1_dd; + GGML_UNUSED(ctx); } void ggml_sycl_op_rms_norm(ggml_backend_sycl_context& ctx, const ggml_tensor* src0, diff --git a/ggml/src/ggml-sycl/rope.cpp b/ggml/src/ggml-sycl/rope.cpp index 1f06f78fa..1244b231a 100644 --- a/ggml/src/ggml-sycl/rope.cpp +++ b/ggml/src/ggml-sycl/rope.cpp @@ -269,7 +269,8 @@ void ggml_sycl_op_rope( } } - (void) src1; - (void) dst; - (void) src1_dd; + GGML_UNUSED(src1); + GGML_UNUSED(dst); + GGML_UNUSED(src1_dd); + GGML_UNUSED(ctx); } diff --git a/ggml/src/ggml-sycl/softmax.cpp b/ggml/src/ggml-sycl/softmax.cpp index 17a542e49..a9b3fce0d 100644 --- a/ggml/src/ggml-sycl/softmax.cpp +++ b/ggml/src/ggml-sycl/softmax.cpp @@ -16,7 +16,7 @@ static void soft_max_f32(const float * x, const float * mask, float * dst, const const int lane_id = item_ct1.get_local_id(2) % WARP_SIZE; const int nthreads = block_size; const int nwarps = nthreads / WARP_SIZE; - int nreduce = nwarps / WARP_SIZE; + size_t nreduce = nwarps / WARP_SIZE; float slope = 1.0f; // ALiBi @@ -53,8 +53,9 @@ static void soft_max_f32(const float * x, const float * mask, float * dst, const if (block_size > WARP_SIZE) { if (warp_id == 0) { buf[lane_id] = -INFINITY; - for (size_t i = 1; i < nreduce; i += 1) + for (size_t i = 1; i < nreduce; i += 1) { buf[lane_id + i * WARP_SIZE] = -INFINITY; + } } item_ct1.barrier(sycl::access::fence_space::local_space); @@ -63,8 +64,7 @@ static void soft_max_f32(const float * x, const float * mask, float * dst, const } item_ct1.barrier(sycl::access::fence_space::local_space); max_val = buf[lane_id]; - for (size_t i = 1; i < nreduce; i += 1) - { + for (size_t i = 1; i < nreduce; i += 1) { max_val = std::max(max_val, buf[lane_id + i * WARP_SIZE]); } max_val = warp_reduce_max(max_val, item_ct1); @@ -89,8 +89,9 @@ static void soft_max_f32(const float * x, const float * mask, float * dst, const item_ct1.barrier(sycl::access::fence_space::local_space); if (warp_id == 0) { buf[lane_id] = 0.f; - for (size_t i = 1; i < nreduce; i += 1) + for (size_t i = 1; i < nreduce; i += 1) { buf[lane_id + i * WARP_SIZE] = 0.f; + } } item_ct1.barrier(sycl::access::fence_space::local_space); @@ -100,8 +101,7 @@ static void soft_max_f32(const float * x, const float * mask, float * dst, const item_ct1.barrier(sycl::access::fence_space::local_space); tmp = buf[lane_id]; - for (size_t i = 1; i < nreduce; i += 1) - { + for (size_t i = 1; i < nreduce; i += 1) { tmp += buf[lane_id + i * WARP_SIZE]; } tmp = warp_reduce_sum(tmp, item_ct1); diff --git a/ggml/src/ggml-sycl/tsembd.cpp b/ggml/src/ggml-sycl/tsembd.cpp index d5c227cd1..2ffe3cca9 100644 --- a/ggml/src/ggml-sycl/tsembd.cpp +++ b/ggml/src/ggml-sycl/tsembd.cpp @@ -68,4 +68,5 @@ void ggml_sycl_op_timestep_embedding(ggml_backend_sycl_context & ctx, const ggml const int max_period = dst->op_params[1]; timestep_embedding_f32_sycl(src0_d, dst_d, src0->ne[0], dst->nb[1], dim, max_period, stream); + GGML_UNUSED(src1); } diff --git a/ggml/src/ggml-sycl/wkv6.cpp b/ggml/src/ggml-sycl/wkv6.cpp index 4c737f4bf..75ddfb86a 100644 --- a/ggml/src/ggml-sycl/wkv6.cpp +++ b/ggml/src/ggml-sycl/wkv6.cpp @@ -59,7 +59,7 @@ static void rwkv_wkv_f32_kernel( float y = 0; // Process in chunks of 4 for better vectorization - sycl::float4 k4, r4, tf4, td4, s4, kv4; + sycl::float4 k4, r4, tf4, td4, s4; #pragma unroll for (int j = 0; j < head_size; j += 4) { // Load data in vec4 chunks @@ -135,4 +135,7 @@ void ggml_sycl_op_rwkv_wkv6(ggml_backend_sycl_context& ctx, const ggml_tensor* s ); }); }); + + GGML_UNUSED(src0); + GGML_UNUSED(src1); } From 64ae0655114f84f11a724bc6878c6f8f4a55560b Mon Sep 17 00:00:00 2001 From: Eve <139727413+netrunnereve@users.noreply.github.com> Date: Fri, 13 Dec 2024 08:42:04 +0000 Subject: [PATCH 011/372] vulkan: small mul_mat_vec optimizations (#10665) * double the number of rows per workgroup * Update ggml-vulkan.cpp * Vulkan: Add VK_EXT_subgroup_size_control support to ensure full subgroups for coopmats * only increase the number of rows for amd and subgroup size 64 * fix missing NUM_ROWS for mul_mat_vec_iq4_nl_f16_f32, untested * use subgroup min and max to check for gcn (requires https://github.com/ggerganov/llama.cpp/pull/10721) * manual merge ggml-vulkan.cpp * set min and max subgroup size in any case * Also double the number of rows for Intel GPUs --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 51 +++++++++------- .../vulkan-shaders/dequant_funcs.comp | 58 ++++++++++--------- .../vulkan-shaders/get_rows_quant.comp | 2 + .../vulkan-shaders/mul_mat_vec.comp | 55 ++++++++---------- 4 files changed, 86 insertions(+), 80 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 74d08815e..515d66b39 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -1845,48 +1845,54 @@ static void ggml_vk_load_shaders(vk_device& device) { } // mul mat vec - // computing two rows per workgroup is a benefit for Q4_0 -> Q5_1, but not for Q8_0. + + // AMD GCN and Intel graphics cards perform best when the number of rows per shader is doubled + uint32_t rm = 1; + if ((device->vendor_id == VK_VENDOR_ID_AMD && device->subgroup_min_size == 64 && device->subgroup_max_size == 64) || device->vendor_id == VK_VENDOR_ID_INTEL) + rm = 2; + + // computing additional rows per workgroup is a benefit for Q4_0 -> Q5_1, but not for Q8_0. ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_F32 ], "mul_mat_vec_f32_f32_f32", mul_mat_vec_f32_f32_f32_len, mul_mat_vec_f32_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_F16 ], "mul_mat_vec_f16_f32_f32", mul_mat_vec_f16_f32_f32_len, mul_mat_vec_f16_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q4_0], "mul_mat_vec_q4_0_f32_f32", mul_mat_vec_q4_0_f32_f32_len, mul_mat_vec_q4_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q4_1], "mul_mat_vec_q4_1_f32_f32", mul_mat_vec_q4_1_f32_f32_len, mul_mat_vec_q4_1_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q5_0], "mul_mat_vec_q5_0_f32_f32", mul_mat_vec_q5_0_f32_f32_len, mul_mat_vec_q5_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q5_1], "mul_mat_vec_q5_1_f32_f32", mul_mat_vec_q5_1_f32_f32_len, mul_mat_vec_q5_1_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q8_0], "mul_mat_vec_q8_0_f32_f32", mul_mat_vec_q8_0_f32_f32_len, mul_mat_vec_q8_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {device->subgroup_size, 1}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q4_0], "mul_mat_vec_q4_0_f32_f32", mul_mat_vec_q4_0_f32_f32_len, mul_mat_vec_q4_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q4_1], "mul_mat_vec_q4_1_f32_f32", mul_mat_vec_q4_1_f32_f32_len, mul_mat_vec_q4_1_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q5_0], "mul_mat_vec_q5_0_f32_f32", mul_mat_vec_q5_0_f32_f32_len, mul_mat_vec_q5_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q5_1], "mul_mat_vec_q5_1_f32_f32", mul_mat_vec_q5_1_f32_f32_len, mul_mat_vec_q5_1_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q8_0], "mul_mat_vec_q8_0_f32_f32", mul_mat_vec_q8_0_f32_f32_len, mul_mat_vec_q8_0_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1*rm, 1, 1}, {device->subgroup_size, 1*rm}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q2_K], "mul_mat_vec_q2_k_f32_f32", mul_mat_vec_q2_k_f32_f32_len, mul_mat_vec_q2_k_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q3_K], "mul_mat_vec_q3_k_f32_f32", mul_mat_vec_q3_k_f32_f32_len, mul_mat_vec_q3_k_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q4_K], "mul_mat_vec_q4_k_f32_f32", mul_mat_vec_q4_k_f32_f32_len, mul_mat_vec_q4_k_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q5_K], "mul_mat_vec_q5_k_f32_f32", mul_mat_vec_q5_k_f32_f32_len, mul_mat_vec_q5_k_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_Q6_K], "mul_mat_vec_q6_k_f32_f32", mul_mat_vec_q6_k_f32_f32_len, mul_mat_vec_q6_k_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_iq4_nl_f32_f32", mul_mat_vec_iq4_nl_f32_f32_len, mul_mat_vec_iq4_nl_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_iq4_nl_f32_f32", mul_mat_vec_iq4_nl_f32_f32_len, mul_mat_vec_iq4_nl_f32_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_F32 ], "mul_mat_vec_f32_f16_f32", mul_mat_vec_f32_f16_f32_len, mul_mat_vec_f32_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_F16 ], "mul_mat_vec_f16_f16_f32", mul_mat_vec_f16_f16_f32_len, mul_mat_vec_f16_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q4_0], "mul_mat_vec_q4_0_f16_f32", mul_mat_vec_q4_0_f16_f32_len, mul_mat_vec_q4_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q4_1], "mul_mat_vec_q4_1_f16_f32", mul_mat_vec_q4_1_f16_f32_len, mul_mat_vec_q4_1_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q5_0], "mul_mat_vec_q5_0_f16_f32", mul_mat_vec_q5_0_f16_f32_len, mul_mat_vec_q5_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q5_1], "mul_mat_vec_q5_1_f16_f32", mul_mat_vec_q5_1_f16_f32_len, mul_mat_vec_q5_1_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q8_0], "mul_mat_vec_q8_0_f16_f32", mul_mat_vec_q8_0_f16_f32_len, mul_mat_vec_q8_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {device->subgroup_size, 1}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q4_0], "mul_mat_vec_q4_0_f16_f32", mul_mat_vec_q4_0_f16_f32_len, mul_mat_vec_q4_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q4_1], "mul_mat_vec_q4_1_f16_f32", mul_mat_vec_q4_1_f16_f32_len, mul_mat_vec_q4_1_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q5_0], "mul_mat_vec_q5_0_f16_f32", mul_mat_vec_q5_0_f16_f32_len, mul_mat_vec_q5_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q5_1], "mul_mat_vec_q5_1_f16_f32", mul_mat_vec_q5_1_f16_f32_len, mul_mat_vec_q5_1_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q8_0], "mul_mat_vec_q8_0_f16_f32", mul_mat_vec_q8_0_f16_f32_len, mul_mat_vec_q8_0_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1*rm, 1, 1}, {device->subgroup_size, 1*rm}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q2_K], "mul_mat_vec_q2_k_f16_f32", mul_mat_vec_q2_k_f16_f32_len, mul_mat_vec_q2_k_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q3_K], "mul_mat_vec_q3_k_f16_f32", mul_mat_vec_q3_k_f16_f32_len, mul_mat_vec_q3_k_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q4_K], "mul_mat_vec_q4_k_f16_f32", mul_mat_vec_q4_k_f16_f32_len, mul_mat_vec_q4_k_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q5_K], "mul_mat_vec_q5_k_f16_f32", mul_mat_vec_q5_k_f16_f32_len, mul_mat_vec_q5_k_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_Q6_K], "mul_mat_vec_q6_k_f16_f32", mul_mat_vec_q6_k_f16_f32_len, mul_mat_vec_q6_k_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_iq4_nl_f16_f32", mul_mat_vec_iq4_nl_f16_f32_len, mul_mat_vec_iq4_nl_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {device->subgroup_size}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_iq4_nl_f16_f32", mul_mat_vec_iq4_nl_f16_f32_len, mul_mat_vec_iq4_nl_f16_f32_data, "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F32 ], "mul_mat_vec_id_f32_f32", mul_mat_vec_id_f32_f32_len, mul_mat_vec_id_f32_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F16 ], "mul_mat_vec_id_f16_f32", mul_mat_vec_id_f16_f32_len, mul_mat_vec_id_f16_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_f32", mul_mat_vec_id_q4_0_f32_len, mul_mat_vec_id_q4_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_f32", mul_mat_vec_id_q4_1_f32_len, mul_mat_vec_id_q4_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_f32", mul_mat_vec_id_q5_0_f32_len, mul_mat_vec_id_q5_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_f32", mul_mat_vec_id_q5_1_f32_len, mul_mat_vec_id_q5_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_f32", mul_mat_vec_id_q8_0_f32_len, mul_mat_vec_id_q8_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {device->subgroup_size, 1}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_f32", mul_mat_vec_id_q4_0_f32_len, mul_mat_vec_id_q4_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_f32", mul_mat_vec_id_q4_1_f32_len, mul_mat_vec_id_q4_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_f32", mul_mat_vec_id_q5_0_f32_len, mul_mat_vec_id_q5_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_f32", mul_mat_vec_id_q5_1_f32_len, mul_mat_vec_id_q5_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_f32", mul_mat_vec_id_q8_0_f32_len, mul_mat_vec_id_q8_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1*rm, 1, 1}, {device->subgroup_size, 1*rm}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q2_K], "mul_mat_vec_id_q2_k_f32", mul_mat_vec_id_q2_k_f32_len, mul_mat_vec_id_q2_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q3_K], "mul_mat_vec_id_q3_k_f32", mul_mat_vec_id_q3_k_f32_len, mul_mat_vec_id_q3_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_K], "mul_mat_vec_id_q4_k_f32", mul_mat_vec_id_q4_k_f32_len, mul_mat_vec_id_q4_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_K], "mul_mat_vec_id_q5_k_f32", mul_mat_vec_id_q5_k_f32_len, mul_mat_vec_id_q5_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q6_K], "mul_mat_vec_id_q6_k_f32", mul_mat_vec_id_q6_k_f32_len, mul_mat_vec_id_q6_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1, 1, 1}, {subgroup_size_16}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_id_iq4_nl_f32", mul_mat_vec_id_iq4_nl_f32_len, mul_mat_vec_id_iq4_nl_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_id_iq4_nl_f32", mul_mat_vec_id_iq4_nl_f32_len, mul_mat_vec_id_iq4_nl_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm, 1, 1}, {device->subgroup_size, 2*rm}, 1, true); // dequant shaders ggml_vk_create_pipeline(device, device->pipeline_dequant[GGML_TYPE_F32 ], "f32_to_f16", dequant_f32_len, dequant_f32_data, "main", 2, 5 * sizeof(uint32_t), {256 * 16, 1, 1}, {}, 1); @@ -2243,13 +2249,16 @@ static vk_device ggml_vk_get_device(size_t idx) { device->pipeline_robustness = pl_robustness_features.pipelineRobustness; + if (device->subgroup_size_control) { + device->subgroup_min_size = subgroup_size_control_props.minSubgroupSize; + device->subgroup_max_size = subgroup_size_control_props.maxSubgroupSize; + } + device->subgroup_size_control = device->subgroup_size_control && (subgroup_size_control_props.requiredSubgroupSizeStages & vk::ShaderStageFlagBits::eCompute) && subgroup_size_control_features.subgroupSizeControl; if (device->subgroup_size_control) { - device->subgroup_min_size = subgroup_size_control_props.minSubgroupSize; - device->subgroup_max_size = subgroup_size_control_props.maxSubgroupSize; device->subgroup_require_full_support = subgroup_size_control_features.computeFullSubgroups; device_extensions.push_back("VK_EXT_subgroup_size_control"); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.comp index 5fc1ba4ad..91bb8f8db 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.comp @@ -25,92 +25,94 @@ vec2 dequantize(uint ib, uint iqs, uint a_offset) { #if defined(DATA_A_Q4_0) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return (vec2(vui & 0xF, vui >> 4) - 8.0f) * d; + return (vec2(vui & 0xF, vui >> 4) - 8.0f); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); const uint vui = uint(data_a_packed16[a_offset + ib].qs[iqs/2]); - return (vec4(vui & 0xF, (vui >> 4) & 0xF, (vui >> 8) & 0xF, (vui >> 12) & 0xF) - 8.0f) * d; + return (vec4(vui & 0xF, (vui >> 4) & 0xF, (vui >> 8) & 0xF, vui >> 12) - 8.0f); } #endif #if defined(DATA_A_Q4_1) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); - const float m = float(data_a[a_offset + ib].m); const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return vec2(vui & 0xF, vui >> 4) * d + m; + return vec2(vui & 0xF, vui >> 4); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); - const float m = float(data_a_packed16[a_offset + ib].m); const uint vui = uint(data_a_packed16[a_offset + ib].qs[iqs/2]); - return vec4(vui & 0xF, (vui >> 4) & 0xF, (vui >> 8) & 0xF, (vui >> 12) & 0xF) * d + m; + return vec4(vui & 0xF, (vui >> 4) & 0xF, (vui >> 8) & 0xF, vui >> 12); } #endif #if defined(DATA_A_Q5_0) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); const uint uint_qh = uint(data_a[a_offset + ib].qh[1]) << 16 | data_a[a_offset + ib].qh[0]; const ivec2 qh = ivec2(((uint_qh >> iqs) << 4) & 0x10, (uint_qh >> (iqs + 12)) & 0x10); const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return (vec2((vui & 0xF) | qh.x, (vui >> 4) | qh.y) - 16.0f) * d; + return (vec2((vui & 0xF) | qh.x, (vui >> 4) | qh.y) - 16.0f); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); const uint uint_qh = uint(data_a_packed16[a_offset + ib].qh[1]) << 16 | data_a_packed16[a_offset + ib].qh[0]; const ivec2 qh0 = ivec2(((uint_qh >> iqs) << 4) & 0x10, (uint_qh >> (iqs + 12)) & 0x10); const ivec2 qh1 = ivec2(((uint_qh >> (iqs + 1)) << 4) & 0x10, (uint_qh >> (iqs + 13)) & 0x10); const uint vui = uint(data_a_packed16[a_offset + ib].qs[iqs/2]); - return (vec4(((vui >> 0) & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, ((vui >> 12) & 0xF) | qh1.y) - 16.0f) * d; + return (vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, (vui >> 12) | qh1.y) - 16.0f); } #endif #if defined(DATA_A_Q5_1) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); - const float m = float(data_a[a_offset + ib].m); const uint uint_qh = data_a[a_offset + ib].qh; const ivec2 qh = ivec2(((uint_qh >> iqs) << 4) & 0x10, (uint_qh >> (iqs + 12)) & 0x10); const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return vec2((vui & 0xF) | qh.x, (vui >> 4) | qh.y) * d + m; + return vec2((vui & 0xF) | qh.x, (vui >> 4) | qh.y); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); - const float m = float(data_a_packed16[a_offset + ib].m); const uint uint_qh = data_a_packed16[a_offset + ib].qh; const ivec2 qh0 = ivec2(((uint_qh >> iqs) << 4) & 0x10, (uint_qh >> (iqs + 12)) & 0x10); const ivec2 qh1 = ivec2(((uint_qh >> (iqs + 1)) << 4) & 0x10, (uint_qh >> (iqs + 13)) & 0x10); const uint vui = uint(data_a_packed16[a_offset + ib].qs[iqs/2]); - return vec4(((vui >> 0) & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, ((vui >> 12) & 0xF) | qh1.y) * d + m; + return vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, (vui >> 12) | qh1.y); } #endif #if defined(DATA_A_Q8_0) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); - return vec2(int(data_a[a_offset + ib].qs[iqs]), int(data_a[a_offset + ib].qs[iqs + 1])) * d; + return vec2(int(data_a[a_offset + ib].qs[iqs]), int(data_a[a_offset + ib].qs[iqs + 1])); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); uint32_t v0 = data_a_packed16[a_offset + ib].qs[iqs/2]; uint32_t v1 = data_a_packed16[a_offset + ib].qs[iqs/2 + 1]; - return vec4(int8_t(v0 & 0xFF), int8_t((v0 >> 8) & 0xFF), int8_t(v1 & 0xFF), int8_t((v1 >> 8) & 0xFF)) * d; + return vec4(int8_t(v0 & 0xFF), int8_t(v0 >> 8), int8_t(v1 & 0xFF), int8_t(v1 >> 8)); } #endif #if defined(DATA_A_IQ4_NL) vec2 dequantize(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a[a_offset + ib].d); const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return vec2(kvalues_iq4nl[vui & 0xF], kvalues_iq4nl[vui >> 4]) * d; + return vec2(kvalues_iq4nl[vui & 0xF], kvalues_iq4nl[vui >> 4]); } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { - const float d = float(data_a_packed16[a_offset + ib].d); const uint vui = uint(data_a_packed16[a_offset + ib].qs[iqs/2]); - return vec4(kvalues_iq4nl[vui & 0xF], kvalues_iq4nl[(vui >> 4) & 0xF], kvalues_iq4nl[(vui >> 8) & 0xF], kvalues_iq4nl[(vui >> 12) & 0xF]) * d; + return vec4(kvalues_iq4nl[vui & 0xF], kvalues_iq4nl[(vui >> 4) & 0xF], kvalues_iq4nl[(vui >> 8) & 0xF], kvalues_iq4nl[vui >> 12]); +} +#endif + +#if defined(DATA_A_F32) || defined(DATA_A_F16) +vec2 get_dm(uint ib, uint a_offset) { + return vec2(0, 0); +} +#endif + +#if defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ4_NL) +vec2 get_dm(uint ib, uint a_offset) { + return vec2(float(data_a[a_offset + ib].d), 0); +} +#endif + +#if defined(DATA_A_Q4_1) || defined(DATA_A_Q5_1) +vec2 get_dm(uint ib, uint a_offset) { + return vec2(float(data_a[a_offset + ib].d), float(data_a[a_offset + ib].m)); } #endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_quant.comp b/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_quant.comp index 7f608315b..1426fde65 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_quant.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_quant.comp @@ -31,6 +31,8 @@ void main() { const uint y_offset = QUANT_R == 1 ? 1 : QUANT_K/2; vec2 v = dequantize(ib, iqs, 0); + const vec2 dm = get_dm(ib, 0); + v = v * dm.x + dm.y; data_d[d_offset + iybs + iqs ] = D_TYPE(v.x); data_d[d_offset + iybs + iqs + y_offset] = D_TYPE(v.y); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp index 2d5b8e466..187c31916 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp @@ -31,27 +31,13 @@ void iter(inout FLOAT_TYPE temp[NUM_ROWS], const uint first_row, const uint num_ #if K_PER_ITER == 8 #if QUANT_R == 2 - B_TYPE_VEC4 bv02 = data_b_v4[(b_offset + iybs + iqs) / 4]; - B_TYPE_VEC4 bv13 = data_b_v4[(b_offset + iybs + iqs + y_offset) / 4]; - FLOAT_TYPE b0 = FLOAT_TYPE(bv02.x); - FLOAT_TYPE b1 = FLOAT_TYPE(bv13.x); - FLOAT_TYPE b2 = FLOAT_TYPE(bv02.y); - FLOAT_TYPE b3 = FLOAT_TYPE(bv13.y); - FLOAT_TYPE b4 = FLOAT_TYPE(bv02.z); - FLOAT_TYPE b5 = FLOAT_TYPE(bv13.z); - FLOAT_TYPE b6 = FLOAT_TYPE(bv02.w); - FLOAT_TYPE b7 = FLOAT_TYPE(bv13.w); + const B_TYPE_VEC4 bv02 = data_b_v4[(b_offset + iybs + iqs) / 4]; + const B_TYPE_VEC4 bv13 = data_b_v4[(b_offset + iybs + iqs + y_offset) / 4]; + const vec4 bv0 = vec4(bv02.x, bv13.x, bv02.y, bv13.y); + const vec4 bv1 = vec4(bv02.z, bv13.z, bv02.w, bv13.w); #else - B_TYPE_VEC4 bv0 = data_b_v4[(b_offset + iybs + iqs) / 4]; - B_TYPE_VEC4 bv1 = data_b_v4[(b_offset + iybs + iqs) / 4 + 1]; - FLOAT_TYPE b0 = FLOAT_TYPE(bv0.x); - FLOAT_TYPE b1 = FLOAT_TYPE(bv0.y); - FLOAT_TYPE b2 = FLOAT_TYPE(bv0.z); - FLOAT_TYPE b3 = FLOAT_TYPE(bv0.w); - FLOAT_TYPE b4 = FLOAT_TYPE(bv1.x); - FLOAT_TYPE b5 = FLOAT_TYPE(bv1.y); - FLOAT_TYPE b6 = FLOAT_TYPE(bv1.z); - FLOAT_TYPE b7 = FLOAT_TYPE(bv1.w); + const vec4 bv0 = vec4(data_b_v4[(b_offset + iybs + iqs) / 4]); + const vec4 bv1 = vec4(data_b_v4[(b_offset + iybs + iqs) / 4 + 1]); #endif #else // Check if the second of the pair of elements is OOB, and don't fetch B or @@ -67,22 +53,29 @@ void iter(inout FLOAT_TYPE temp[NUM_ROWS], const uint first_row, const uint num_ b1 = FLOAT_TYPE(data_b[b_offset + iybs + iqs + y_offset]); } #endif + uint ibi = first_row*p.ncols; [[unroll]] for (uint n = 0; n < num_rows; ++n) { - const uint ib = ((first_row + n)*p.ncols + col)/QUANT_K; // block index + const uint ib = (ibi + col)/QUANT_K; // block index + ibi += p.ncols; #if K_PER_ITER == 8 - const vec4 v = dequantize4(ib, iqs, a_offset); - const vec4 v2 = dequantize4(ib, iqs+(4/QUANT_R), a_offset); + vec4 v = dequantize4(ib, iqs, a_offset); + vec4 v2 = dequantize4(ib, iqs+(4/QUANT_R), a_offset); + + const vec2 dm = get_dm(ib, a_offset); + if (dm.y != 0) { // quant has min component + v = v * dm.x + dm.y; + v2 = v2 * dm.x + dm.y; + } // matrix multiplication - temp[n] = fma(FLOAT_TYPE(v.x), b0, temp[n]); - temp[n] = fma(FLOAT_TYPE(v.y), b1, temp[n]); - temp[n] = fma(FLOAT_TYPE(v.z), b2, temp[n]); - temp[n] = fma(FLOAT_TYPE(v.w), b3, temp[n]); - temp[n] = fma(FLOAT_TYPE(v2.x), b4, temp[n]); - temp[n] = fma(FLOAT_TYPE(v2.y), b5, temp[n]); - temp[n] = fma(FLOAT_TYPE(v2.z), b6, temp[n]); - temp[n] = fma(FLOAT_TYPE(v2.w), b7, temp[n]); + FLOAT_TYPE rowtmp = dot(bv0, v); + rowtmp += dot(bv1, v2); + + if (dm.y == 0) + rowtmp *= dm.x; + + temp[n] += rowtmp; #else const vec2 v = dequantize(ib, iqs, a_offset); From 9f35e44592a7646a5803620eb6a3f0ed5ac90553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E4=B9=83=E9=97=BB?= Date: Fri, 13 Dec 2024 12:56:07 +0000 Subject: [PATCH 012/372] Fix crash caused by ggml_backend_load_all when launching on Android Activity (#10812) * Fix crash caused by ggml_backend_load_all when launching on AndroidActivity. Details: Calling ggml_backend_load_all during initialization in the AndroidActivity project leads to a crash with the error: terminating with uncaught exception of type std::__ndk1::__fs::filesystem::filesystem_error: filesystem error: in directory_iterator::directory_iterator(...): Permission denied [./]. This issue occurs because AndroidActivity restricts file access due to sandboxing. Reproduction: In the example folder, the LlamaAndroid project can reproduce the crash by calling ggml_backend_load_all first in Java_android_llama_cpp_LLamaAndroid_backend_1init. * Update ggml/src/ggml-backend-reg.cpp --------- Co-authored-by: Diego Devesa --- ggml/src/ggml-backend-reg.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ggml/src/ggml-backend-reg.cpp b/ggml/src/ggml-backend-reg.cpp index 2e7340145..b2eded903 100644 --- a/ggml/src/ggml-backend-reg.cpp +++ b/ggml/src/ggml-backend-reg.cpp @@ -473,7 +473,8 @@ static ggml_backend_reg_t ggml_backend_load_best(const char * name, bool silent, if (!fs::exists(search_path)) { continue; } - for (const auto & entry : fs::directory_iterator(search_path)) { + fs::directory_iterator dir_it(search_path, fs::directory_options::skip_permission_denied); + for (const auto & entry : dir_it) { if (entry.is_regular_file()) { std::string filename = entry.path().filename().string(); std::string ext = entry.path().extension().string(); From 4601a8bb6784d2ab8b4b605354b51979fbeea1d3 Mon Sep 17 00:00:00 2001 From: Jett Janiak Date: Fri, 13 Dec 2024 15:48:44 +0100 Subject: [PATCH 013/372] gguf-py : numpy 2 newbyteorder fix (#9772) --- gguf-py/gguf/gguf_reader.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/gguf-py/gguf/gguf_reader.py b/gguf-py/gguf/gguf_reader.py index e8e61abf8..e17a4e831 100644 --- a/gguf-py/gguf/gguf_reader.py +++ b/gguf-py/gguf/gguf_reader.py @@ -145,11 +145,10 @@ class GGUFReader: count = int(count) itemsize = int(np.empty([], dtype = dtype).itemsize) end_offs = offset + itemsize * count - return ( - self.data[offset:end_offs] - .view(dtype = dtype)[:count] - .newbyteorder(override_order or self.byte_order) - ) + arr = self.data[offset:end_offs].view(dtype=dtype)[:count] + if override_order is None: + return arr + return arr.view(arr.dtype.newbyteorder(override_order)) def _push_field(self, field: ReaderField, skip_sum: bool = False) -> int: if field.name in self.fields: From 11e07fd63bac1cb642380a7a3eac03fd8703e948 Mon Sep 17 00:00:00 2001 From: Corentin REGAL Date: Fri, 13 Dec 2024 18:23:50 +0100 Subject: [PATCH 014/372] fix: graceful shutdown for Docker images (#10815) --- .devops/tools.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.devops/tools.sh b/.devops/tools.sh index 24dcfd350..9a86e6ea0 100755 --- a/.devops/tools.sh +++ b/.devops/tools.sh @@ -8,11 +8,11 @@ arg1="$1" shift if [[ "$arg1" == '--convert' || "$arg1" == '-c' ]]; then - python3 ./convert_hf_to_gguf.py "$@" + exec python3 ./convert_hf_to_gguf.py "$@" elif [[ "$arg1" == '--quantize' || "$arg1" == '-q' ]]; then - ./llama-quantize "$@" + exec ./llama-quantize "$@" elif [[ "$arg1" == '--run' || "$arg1" == '-r' ]]; then - ./llama-cli "$@" + exec ./llama-cli "$@" elif [[ "$arg1" == '--all-in-one' || "$arg1" == '-a' ]]; then echo "Converting PTH to GGML..." for i in `ls $1/$2/ggml-model-f16.bin*`; do @@ -20,11 +20,11 @@ elif [[ "$arg1" == '--all-in-one' || "$arg1" == '-a' ]]; then echo "Skip model quantization, it already exists: ${i/f16/q4_0}" else echo "Converting PTH to GGML: $i into ${i/f16/q4_0}..." - ./llama-quantize "$i" "${i/f16/q4_0}" q4_0 + exec ./llama-quantize "$i" "${i/f16/q4_0}" q4_0 fi done elif [[ "$arg1" == '--server' || "$arg1" == '-s' ]]; then - ./llama-server "$@" + exec ./llama-server "$@" else echo "Unknown command: $arg1" echo "Available commands: " From c27ac678dd393af0da9b8acf10266e760c8a0912 Mon Sep 17 00:00:00 2001 From: Eric Curtin Date: Fri, 13 Dec 2024 18:34:25 +0000 Subject: [PATCH 015/372] Opt class for positional argument handling (#10508) Added support for positional arguments `model` and `prompt`. Added functionality to download via strings like: llama-run llama3 llama-run ollama://granite-code llama-run ollama://granite-code:8b llama-run hf://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf llama-run huggingface://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf llama-run https://example.com/some-file1.gguf llama-run some-file2.gguf llama-run file://some-file3.gguf Signed-off-by: Eric Curtin --- README.md | 14 + common/CMakeLists.txt | 2 +- common/common.cpp | 6 - common/common.h | 11 +- examples/run/CMakeLists.txt | 2 +- examples/run/README.md | 42 ++- examples/run/run.cpp | 628 +++++++++++++++++++++++++++--------- 7 files changed, 542 insertions(+), 163 deletions(-) diff --git a/README.md b/README.md index 6fdd8d9ee..54466c250 100644 --- a/README.md +++ b/README.md @@ -433,6 +433,20 @@ To learn more about model quantization, [read this documentation](examples/quant +## [`llama-run`](examples/run) + +#### A comprehensive example for running `llama.cpp` models. Useful for inferencing. Used with RamaLama [^3]. + +-
+ Run a model with a specific prompt (by default it's pulled from Ollama registry) + + ```bash + llama-run granite-code + ``` + +
+ +[^3]: [https://github.com/containers/ramalama](RamaLama) ## [`llama-simple`](examples/simple) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 89862fe11..df1cdf9a5 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -81,7 +81,7 @@ set(LLAMA_COMMON_EXTRA_LIBS build_info) # Use curl to download model url if (LLAMA_CURL) find_package(CURL REQUIRED) - add_definitions(-DLLAMA_USE_CURL) + target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_CURL) include_directories(${CURL_INCLUDE_DIRS}) find_library(CURL_LIBRARY curl REQUIRED) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} ${CURL_LIBRARY}) diff --git a/common/common.cpp b/common/common.cpp index 3cd43ecdf..3adfb0329 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -1076,12 +1076,6 @@ struct ggml_threadpool_params ggml_threadpool_params_from_cpu_params(const cpu_p #define CURL_MAX_RETRY 3 #define CURL_RETRY_DELAY_SECONDS 2 - -static bool starts_with(const std::string & str, const std::string & prefix) { - // While we wait for C++20's std::string::starts_with... - return str.rfind(prefix, 0) == 0; -} - static bool curl_perform_with_retry(const std::string& url, CURL* curl, int max_attempts, int retry_delay_seconds) { int remaining_attempts = max_attempts; diff --git a/common/common.h b/common/common.h index 0481720ab..9e47b70a4 100644 --- a/common/common.h +++ b/common/common.h @@ -37,9 +37,9 @@ using llama_tokens = std::vector; // build info extern int LLAMA_BUILD_NUMBER; -extern char const * LLAMA_COMMIT; -extern char const * LLAMA_COMPILER; -extern char const * LLAMA_BUILD_TARGET; +extern const char * LLAMA_COMMIT; +extern const char * LLAMA_COMPILER; +extern const char * LLAMA_BUILD_TARGET; struct common_control_vector_load_info; @@ -437,6 +437,11 @@ std::vector string_split(const std::string & input, ch return parts; } +static bool string_starts_with(const std::string & str, + const std::string & prefix) { // While we wait for C++20's std::string::starts_with... + return str.rfind(prefix, 0) == 0; +} + bool string_parse_kv_override(const char * data, std::vector & overrides); void string_process_escapes(std::string & input); diff --git a/examples/run/CMakeLists.txt b/examples/run/CMakeLists.txt index 52add51ef..0686d6305 100644 --- a/examples/run/CMakeLists.txt +++ b/examples/run/CMakeLists.txt @@ -1,5 +1,5 @@ set(TARGET llama-run) add_executable(${TARGET} run.cpp) install(TARGETS ${TARGET} RUNTIME) -target_link_libraries(${TARGET} PRIVATE llama ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) target_compile_features(${TARGET} PRIVATE cxx_std_17) diff --git a/examples/run/README.md b/examples/run/README.md index 6e926811f..6162658e9 100644 --- a/examples/run/README.md +++ b/examples/run/README.md @@ -3,5 +3,45 @@ The purpose of this example is to demonstrate a minimal usage of llama.cpp for running models. ```bash -./llama-run Meta-Llama-3.1-8B-Instruct.gguf +llama-run granite-code +... + +```bash +llama-run -h +Description: + Runs a llm + +Usage: + llama-run [options] model [prompt] + +Options: + -c, --context-size + Context size (default: 2048) + -n, --ngl + Number of GPU layers (default: 0) + -h, --help + Show help message + +Commands: + model + Model is a string with an optional prefix of + huggingface:// (hf://), ollama://, https:// or file://. + If no protocol is specified and a file exists in the specified + path, file:// is assumed, otherwise if a file does not exist in + the specified path, ollama:// is assumed. Models that are being + pulled are downloaded with .partial extension while being + downloaded and then renamed as the file without the .partial + extension when complete. + +Examples: + llama-run llama3 + llama-run ollama://granite-code + llama-run ollama://smollm:135m + llama-run hf://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf + llama-run huggingface://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf + llama-run https://example.com/some-file1.gguf + llama-run some-file2.gguf + llama-run file://some-file3.gguf + llama-run --ngl 99 some-file4.gguf + llama-run --ngl 99 some-file5.gguf Hello World ... diff --git a/examples/run/run.cpp b/examples/run/run.cpp index cac2faefc..834ea8f7b 100644 --- a/examples/run/run.cpp +++ b/examples/run/run.cpp @@ -1,128 +1,350 @@ #if defined(_WIN32) -#include +# include #else -#include +# include #endif -#include +#if defined(LLAMA_USE_CURL) +# include +#endif + +#include #include #include +#include #include #include #include -#include #include +#include "common.h" +#include "json.hpp" #include "llama-cpp.h" -typedef std::unique_ptr char_array_ptr; +#define printe(...) \ + do { \ + fprintf(stderr, __VA_ARGS__); \ + } while (0) -struct Argument { - std::string flag; - std::string help_text; -}; +class Opt { + public: + int init(int argc, const char ** argv) { + construct_help_str_(); + // Parse arguments + if (parse(argc, argv)) { + printe("Error: Failed to parse arguments.\n"); + help(); + return 1; + } -struct Options { - std::string model_path, prompt_non_interactive; - int ngl = 99; - int n_ctx = 2048; -}; + // If help is requested, show help and exit + if (help_) { + help(); + return 2; + } -class ArgumentParser { - public: - ArgumentParser(const char * program_name) : program_name(program_name) {} - - void add_argument(const std::string & flag, std::string & var, const std::string & help_text = "") { - string_args[flag] = &var; - arguments.push_back({flag, help_text}); + return 0; // Success } - void add_argument(const std::string & flag, int & var, const std::string & help_text = "") { - int_args[flag] = &var; - arguments.push_back({flag, help_text}); + std::string model_; + std::string user_; + int context_size_ = 2048, ngl_ = -1; + + private: + std::string help_str_; + bool help_ = false; + + void construct_help_str_() { + help_str_ = + "Description:\n" + " Runs a llm\n" + "\n" + "Usage:\n" + " llama-run [options] model [prompt]\n" + "\n" + "Options:\n" + " -c, --context-size \n" + " Context size (default: " + + std::to_string(context_size_); + help_str_ += + ")\n" + " -n, --ngl \n" + " Number of GPU layers (default: " + + std::to_string(ngl_); + help_str_ += + ")\n" + " -h, --help\n" + " Show help message\n" + "\n" + "Commands:\n" + " model\n" + " Model is a string with an optional prefix of \n" + " huggingface:// (hf://), ollama://, https:// or file://.\n" + " If no protocol is specified and a file exists in the specified\n" + " path, file:// is assumed, otherwise if a file does not exist in\n" + " the specified path, ollama:// is assumed. Models that are being\n" + " pulled are downloaded with .partial extension while being\n" + " downloaded and then renamed as the file without the .partial\n" + " extension when complete.\n" + "\n" + "Examples:\n" + " llama-run llama3\n" + " llama-run ollama://granite-code\n" + " llama-run ollama://smollm:135m\n" + " llama-run hf://QuantFactory/SmolLM-135M-GGUF/SmolLM-135M.Q2_K.gguf\n" + " llama-run huggingface://bartowski/SmolLM-1.7B-Instruct-v0.2-GGUF/SmolLM-1.7B-Instruct-v0.2-IQ3_M.gguf\n" + " llama-run https://example.com/some-file1.gguf\n" + " llama-run some-file2.gguf\n" + " llama-run file://some-file3.gguf\n" + " llama-run --ngl 99 some-file4.gguf\n" + " llama-run --ngl 99 some-file5.gguf Hello World\n"; } int parse(int argc, const char ** argv) { + int positional_args_i = 0; for (int i = 1; i < argc; ++i) { - std::string arg = argv[i]; - if (string_args.count(arg)) { - if (i + 1 < argc) { - *string_args[arg] = argv[++i]; - } else { - fprintf(stderr, "error: missing value for %s\n", arg.c_str()); - print_usage(); + if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--context-size") == 0) { + if (i + 1 >= argc) { return 1; } - } else if (int_args.count(arg)) { - if (i + 1 < argc) { - if (parse_int_arg(argv[++i], *int_args[arg]) != 0) { - fprintf(stderr, "error: invalid value for %s: %s\n", arg.c_str(), argv[i]); - print_usage(); - return 1; - } - } else { - fprintf(stderr, "error: missing value for %s\n", arg.c_str()); - print_usage(); + + context_size_ = std::atoi(argv[++i]); + } else if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--ngl") == 0) { + if (i + 1 >= argc) { return 1; } + + ngl_ = std::atoi(argv[++i]); + } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { + help_ = true; + return 0; + } else if (!positional_args_i) { + ++positional_args_i; + model_ = argv[i]; + } else if (positional_args_i == 1) { + ++positional_args_i; + user_ = argv[i]; } else { - fprintf(stderr, "error: unrecognized argument %s\n", arg.c_str()); - print_usage(); - return 1; + user_ += " " + std::string(argv[i]); } } - if (string_args["-m"]->empty()) { - fprintf(stderr, "error: -m is required\n"); - print_usage(); + return model_.empty(); // model_ is the only required value + } + + void help() const { printf("%s", help_str_.c_str()); } +}; + +struct progress_data { + size_t file_size = 0; + std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + bool printed = false; +}; + +struct FileDeleter { + void operator()(FILE * file) const { + if (file) { + fclose(file); + } + } +}; + +typedef std::unique_ptr FILE_ptr; + +#ifdef LLAMA_USE_CURL +class CurlWrapper { + public: + int init(const std::string & url, const std::vector & headers, const std::string & output_file, + const bool progress, std::string * response_str = nullptr) { + std::string output_file_partial; + curl = curl_easy_init(); + if (!curl) { return 1; } + progress_data data; + FILE_ptr out; + if (!output_file.empty()) { + output_file_partial = output_file + ".partial"; + out.reset(fopen(output_file_partial.c_str(), "ab")); + } + + set_write_options(response_str, out); + data.file_size = set_resume_point(output_file_partial); + set_progress_options(progress, data); + set_headers(headers); + perform(url); + if (!output_file.empty()) { + std::filesystem::rename(output_file_partial, output_file); + } + return 0; } - private: - const char * program_name; - std::unordered_map string_args; - std::unordered_map int_args; - std::vector arguments; + ~CurlWrapper() { + if (chunk) { + curl_slist_free_all(chunk); + } - int parse_int_arg(const char * arg, int & value) { - char * end; - const long val = std::strtol(arg, &end, 10); - if (*end == '\0' && val >= INT_MIN && val <= INT_MAX) { - value = static_cast(val); + if (curl) { + curl_easy_cleanup(curl); + } + } + + private: + CURL * curl = nullptr; + struct curl_slist * chunk = nullptr; + + void set_write_options(std::string * response_str, const FILE_ptr & out) { + if (response_str) { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, capture_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_str); + } else { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, out.get()); + } + } + + size_t set_resume_point(const std::string & output_file) { + size_t file_size = 0; + if (std::filesystem::exists(output_file)) { + file_size = std::filesystem::file_size(output_file); + curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, static_cast(file_size)); + } + + return file_size; + } + + void set_progress_options(bool progress, progress_data & data) { + if (progress) { + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &data); + curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback); + } + } + + void set_headers(const std::vector & headers) { + if (!headers.empty()) { + if (chunk) { + curl_slist_free_all(chunk); + chunk = 0; + } + + for (const auto & header : headers) { + chunk = curl_slist_append(chunk, header.c_str()); + } + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + } + } + + void perform(const std::string & url) { + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https"); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); + res = curl_easy_perform(curl); + if (res != CURLE_OK) { + printe("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + } + } + + static std::string human_readable_time(double seconds) { + int hrs = static_cast(seconds) / 3600; + int mins = (static_cast(seconds) % 3600) / 60; + int secs = static_cast(seconds) % 60; + + std::ostringstream out; + if (hrs > 0) { + out << hrs << "h " << std::setw(2) << std::setfill('0') << mins << "m " << std::setw(2) << std::setfill('0') + << secs << "s"; + } else if (mins > 0) { + out << mins << "m " << std::setw(2) << std::setfill('0') << secs << "s"; + } else { + out << secs << "s"; + } + + return out.str(); + } + + static std::string human_readable_size(curl_off_t size) { + static const char * suffix[] = { "B", "KB", "MB", "GB", "TB" }; + char length = sizeof(suffix) / sizeof(suffix[0]); + int i = 0; + double dbl_size = size; + if (size > 1024) { + for (i = 0; (size / 1024) > 0 && i < length - 1; i++, size /= 1024) { + dbl_size = size / 1024.0; + } + } + + std::ostringstream out; + out << std::fixed << std::setprecision(2) << dbl_size << " " << suffix[i]; + return out.str(); + } + + static int progress_callback(void * ptr, curl_off_t total_to_download, curl_off_t now_downloaded, curl_off_t, + curl_off_t) { + progress_data * data = static_cast(ptr); + if (total_to_download <= 0) { return 0; } - return 1; - } - void print_usage() const { - printf("\nUsage:\n"); - printf(" %s [OPTIONS]\n\n", program_name); - printf("Options:\n"); - for (const auto & arg : arguments) { - printf(" %-10s %s\n", arg.flag.c_str(), arg.help_text.c_str()); + total_to_download += data->file_size; + const curl_off_t now_downloaded_plus_file_size = now_downloaded + data->file_size; + const curl_off_t percentage = (now_downloaded_plus_file_size * 100) / total_to_download; + const curl_off_t pos = (percentage / 5); + std::string progress_bar; + for (int i = 0; i < 20; ++i) { + progress_bar.append((i < pos) ? "█" : " "); } - printf("\n"); + // Calculate download speed and estimated time to completion + const auto now = std::chrono::steady_clock::now(); + const std::chrono::duration elapsed_seconds = now - data->start_time; + const double speed = now_downloaded / elapsed_seconds.count(); + const double estimated_time = (total_to_download - now_downloaded) / speed; + printe("\r%ld%% |%s| %s/%s %.2f MB/s %s ", percentage, progress_bar.c_str(), + human_readable_size(now_downloaded).c_str(), human_readable_size(total_to_download).c_str(), + speed / (1024 * 1024), human_readable_time(estimated_time).c_str()); + fflush(stderr); + data->printed = true; + + return 0; + } + + // Function to write data to a file + static size_t write_data(void * ptr, size_t size, size_t nmemb, void * stream) { + FILE * out = static_cast(stream); + return fwrite(ptr, size, nmemb, out); + } + + // Function to capture data into a string + static size_t capture_data(void * ptr, size_t size, size_t nmemb, void * stream) { + std::string * str = static_cast(stream); + str->append(static_cast(ptr), size * nmemb); + return size * nmemb; } }; +#endif class LlamaData { - public: - llama_model_ptr model; - llama_sampler_ptr sampler; - llama_context_ptr context; + public: + llama_model_ptr model; + llama_sampler_ptr sampler; + llama_context_ptr context; std::vector messages; + std::vector msg_strs; + std::vector fmtted; - int init(const Options & opt) { - model = initialize_model(opt.model_path, opt.ngl); + int init(Opt & opt) { + model = initialize_model(opt); if (!model) { return 1; } - context = initialize_context(model, opt.n_ctx); + context = initialize_context(model, opt.context_size_); if (!context) { return 1; } @@ -131,15 +353,123 @@ class LlamaData { return 0; } - private: - // Initializes the model and returns a unique pointer to it - llama_model_ptr initialize_model(const std::string & model_path, const int ngl) { - llama_model_params model_params = llama_model_default_params(); - model_params.n_gpu_layers = ngl; + private: +#ifdef LLAMA_USE_CURL + int download(const std::string & url, const std::vector & headers, const std::string & output_file, + const bool progress, std::string * response_str = nullptr) { + CurlWrapper curl; + if (curl.init(url, headers, output_file, progress, response_str)) { + return 1; + } - llama_model_ptr model(llama_load_model_from_file(model_path.c_str(), model_params)); + return 0; + } +#else + int download(const std::string &, const std::vector &, const std::string &, const bool, + std::string * = nullptr) { + printe("%s: llama.cpp built without libcurl, downloading from an url not supported.\n", __func__); + return 1; + } +#endif + + int huggingface_dl(const std::string & model, const std::vector headers, const std::string & bn) { + // Find the second occurrence of '/' after protocol string + size_t pos = model.find('/'); + pos = model.find('/', pos + 1); + if (pos == std::string::npos) { + return 1; + } + + const std::string hfr = model.substr(0, pos); + const std::string hff = model.substr(pos + 1); + const std::string url = "https://huggingface.co/" + hfr + "/resolve/main/" + hff; + return download(url, headers, bn, true); + } + + int ollama_dl(std::string & model, const std::vector headers, const std::string & bn) { + if (model.find('/') == std::string::npos) { + model = "library/" + model; + } + + std::string model_tag = "latest"; + size_t colon_pos = model.find(':'); + if (colon_pos != std::string::npos) { + model_tag = model.substr(colon_pos + 1); + model = model.substr(0, colon_pos); + } + + std::string manifest_url = "https://registry.ollama.ai/v2/" + model + "/manifests/" + model_tag; + std::string manifest_str; + const int ret = download(manifest_url, headers, "", false, &manifest_str); + if (ret) { + return ret; + } + + nlohmann::json manifest = nlohmann::json::parse(manifest_str); + std::string layer; + for (const auto & l : manifest["layers"]) { + if (l["mediaType"] == "application/vnd.ollama.image.model") { + layer = l["digest"]; + break; + } + } + + std::string blob_url = "https://registry.ollama.ai/v2/" + model + "/blobs/" + layer; + return download(blob_url, headers, bn, true); + } + + std::string basename(const std::string & path) { + const size_t pos = path.find_last_of("/\\"); + if (pos == std::string::npos) { + return path; + } + + return path.substr(pos + 1); + } + + int remove_proto(std::string & model_) { + const std::string::size_type pos = model_.find("://"); + if (pos == std::string::npos) { + return 1; + } + + model_ = model_.substr(pos + 3); // Skip past "://" + return 0; + } + + int resolve_model(std::string & model_) { + const std::string bn = basename(model_); + const std::vector headers = { "--header", + "Accept: application/vnd.docker.distribution.manifest.v2+json" }; + int ret = 0; + if (string_starts_with(model_, "file://") || std::filesystem::exists(bn)) { + remove_proto(model_); + } else if (string_starts_with(model_, "hf://") || string_starts_with(model_, "huggingface://")) { + remove_proto(model_); + ret = huggingface_dl(model_, headers, bn); + } else if (string_starts_with(model_, "ollama://")) { + remove_proto(model_); + ret = ollama_dl(model_, headers, bn); + } else if (string_starts_with(model_, "https://")) { + download(model_, headers, bn, true); + } else { + ret = ollama_dl(model_, headers, bn); + } + + model_ = bn; + + return ret; + } + + // Initializes the model and returns a unique pointer to it + llama_model_ptr initialize_model(Opt & opt) { + ggml_backend_load_all(); + llama_model_params model_params = llama_model_default_params(); + model_params.n_gpu_layers = opt.ngl_ >= 0 ? opt.ngl_ : model_params.n_gpu_layers; + resolve_model(opt.model_); + llama_model_ptr model(llama_load_model_from_file(opt.model_.c_str(), model_params)); if (!model) { - fprintf(stderr, "%s: error: unable to load model\n", __func__); + printe("%s: error: unable to load model from file: %s\n", __func__, opt.model_.c_str()); } return model; @@ -148,12 +478,11 @@ class LlamaData { // Initializes the context with the specified parameters llama_context_ptr initialize_context(const llama_model_ptr & model, const int n_ctx) { llama_context_params ctx_params = llama_context_default_params(); - ctx_params.n_ctx = n_ctx; - ctx_params.n_batch = n_ctx; - + ctx_params.n_ctx = n_ctx; + ctx_params.n_batch = n_ctx; llama_context_ptr context(llama_new_context_with_model(model.get(), ctx_params)); if (!context) { - fprintf(stderr, "%s: error: failed to create the llama_context\n", __func__); + printe("%s: error: failed to create the llama_context\n", __func__); } return context; @@ -170,23 +499,22 @@ class LlamaData { } }; -// Add a message to `messages` and store its content in `owned_content` -static void add_message(const char * role, const std::string & text, LlamaData & llama_data, - std::vector & owned_content) { - char_array_ptr content(new char[text.size() + 1]); - std::strcpy(content.get(), text.c_str()); - llama_data.messages.push_back({role, content.get()}); - owned_content.push_back(std::move(content)); +// Add a message to `messages` and store its content in `msg_strs` +static void add_message(const char * role, const std::string & text, LlamaData & llama_data) { + llama_data.msg_strs.push_back(std::move(text)); + llama_data.messages.push_back({ role, llama_data.msg_strs.back().c_str() }); } // Function to apply the chat template and resize `formatted` if needed -static int apply_chat_template(const LlamaData & llama_data, std::vector & formatted, const bool append) { - int result = llama_chat_apply_template(llama_data.model.get(), nullptr, llama_data.messages.data(), - llama_data.messages.size(), append, formatted.data(), formatted.size()); - if (result > static_cast(formatted.size())) { - formatted.resize(result); +static int apply_chat_template(LlamaData & llama_data, const bool append) { + int result = llama_chat_apply_template( + llama_data.model.get(), nullptr, llama_data.messages.data(), llama_data.messages.size(), append, + append ? llama_data.fmtted.data() : nullptr, append ? llama_data.fmtted.size() : 0); + if (append && result > static_cast(llama_data.fmtted.size())) { + llama_data.fmtted.resize(result); result = llama_chat_apply_template(llama_data.model.get(), nullptr, llama_data.messages.data(), - llama_data.messages.size(), append, formatted.data(), formatted.size()); + llama_data.messages.size(), append, llama_data.fmtted.data(), + llama_data.fmtted.size()); } return result; @@ -199,7 +527,8 @@ static int tokenize_prompt(const llama_model_ptr & model, const std::string & pr prompt_tokens.resize(n_prompt_tokens); if (llama_tokenize(model.get(), prompt.c_str(), prompt.size(), prompt_tokens.data(), prompt_tokens.size(), true, true) < 0) { - GGML_ABORT("failed to tokenize the prompt\n"); + printe("failed to tokenize the prompt\n"); + return -1; } return n_prompt_tokens; @@ -207,11 +536,11 @@ static int tokenize_prompt(const llama_model_ptr & model, const std::string & pr // Check if we have enough space in the context to evaluate this batch static int check_context_size(const llama_context_ptr & ctx, const llama_batch & batch) { - const int n_ctx = llama_n_ctx(ctx.get()); + const int n_ctx = llama_n_ctx(ctx.get()); const int n_ctx_used = llama_get_kv_cache_used_cells(ctx.get()); if (n_ctx_used + batch.n_tokens > n_ctx) { printf("\033[0m\n"); - fprintf(stderr, "context size exceeded\n"); + printe("context size exceeded\n"); return 1; } @@ -221,9 +550,10 @@ static int check_context_size(const llama_context_ptr & ctx, const llama_batch & // convert the token to a string static int convert_token_to_string(const llama_model_ptr & model, const llama_token token_id, std::string & piece) { char buf[256]; - int n = llama_token_to_piece(model.get(), token_id, buf, sizeof(buf), 0, true); + int n = llama_token_to_piece(model.get(), token_id, buf, sizeof(buf), 0, true); if (n < 0) { - GGML_ABORT("failed to convert token to piece\n"); + printe("failed to convert token to piece\n"); + return 1; } piece = std::string(buf, n); @@ -238,19 +568,19 @@ static void print_word_and_concatenate_to_response(const std::string & piece, st // helper function to evaluate a prompt and generate a response static int generate(LlamaData & llama_data, const std::string & prompt, std::string & response) { - std::vector prompt_tokens; - const int n_prompt_tokens = tokenize_prompt(llama_data.model, prompt, prompt_tokens); - if (n_prompt_tokens < 0) { + std::vector tokens; + if (tokenize_prompt(llama_data.model, prompt, tokens) < 0) { return 1; } // prepare a batch for the prompt - llama_batch batch = llama_batch_get_one(prompt_tokens.data(), prompt_tokens.size()); + llama_batch batch = llama_batch_get_one(tokens.data(), tokens.size()); llama_token new_token_id; while (true) { check_context_size(llama_data.context, batch); if (llama_decode(llama_data.context.get(), batch)) { - GGML_ABORT("failed to decode\n"); + printe("failed to decode\n"); + return 1; } // sample the next token, check is it an end of generation? @@ -273,22 +603,9 @@ static int generate(LlamaData & llama_data, const std::string & prompt, std::str return 0; } -static int parse_arguments(const int argc, const char ** argv, Options & opt) { - ArgumentParser parser(argv[0]); - parser.add_argument("-m", opt.model_path, "model"); - parser.add_argument("-p", opt.prompt_non_interactive, "prompt"); - parser.add_argument("-c", opt.n_ctx, "context_size"); - parser.add_argument("-ngl", opt.ngl, "n_gpu_layers"); - if (parser.parse(argc, argv)) { - return 1; - } - - return 0; -} - static int read_user_input(std::string & user) { std::getline(std::cin, user); - return user.empty(); // Indicate an error or empty input + return user.empty(); // Should have data in happy path } // Function to generate a response based on the prompt @@ -296,7 +613,7 @@ static int generate_response(LlamaData & llama_data, const std::string & prompt, // Set response color printf("\033[33m"); if (generate(llama_data, prompt, response)) { - fprintf(stderr, "failed to generate response\n"); + printe("failed to generate response\n"); return 1; } @@ -306,11 +623,10 @@ static int generate_response(LlamaData & llama_data, const std::string & prompt, } // Helper function to apply the chat template and handle errors -static int apply_chat_template_with_error_handling(const LlamaData & llama_data, std::vector & formatted, - const bool is_user_input, int & output_length) { - const int new_len = apply_chat_template(llama_data, formatted, is_user_input); +static int apply_chat_template_with_error_handling(LlamaData & llama_data, const bool append, int & output_length) { + const int new_len = apply_chat_template(llama_data, append); if (new_len < 0) { - fprintf(stderr, "failed to apply the chat template\n"); + printe("failed to apply the chat template\n"); return -1; } @@ -319,56 +635,63 @@ static int apply_chat_template_with_error_handling(const LlamaData & llama_data, } // Helper function to handle user input -static bool handle_user_input(std::string & user_input, const std::string & prompt_non_interactive) { - if (!prompt_non_interactive.empty()) { - user_input = prompt_non_interactive; - return true; // No need for interactive input +static int handle_user_input(std::string & user_input, const std::string & user_) { + if (!user_.empty()) { + user_input = user_; + return 0; // No need for interactive input } - printf("\033[32m> \033[0m"); - return !read_user_input(user_input); // Returns false if input ends the loop + printf( + "\r " + "\r\033[32m> \033[0m"); + return read_user_input(user_input); // Returns true if input ends the loop } // Function to tokenize the prompt -static int chat_loop(LlamaData & llama_data, std::string & prompt_non_interactive) { - std::vector owned_content; - std::vector fmtted(llama_n_ctx(llama_data.context.get())); +static int chat_loop(LlamaData & llama_data, const std::string & user_) { int prev_len = 0; - + llama_data.fmtted.resize(llama_n_ctx(llama_data.context.get())); while (true) { // Get user input std::string user_input; - if (!handle_user_input(user_input, prompt_non_interactive)) { - break; + while (handle_user_input(user_input, user_)) { } - add_message("user", prompt_non_interactive.empty() ? user_input : prompt_non_interactive, llama_data, - owned_content); - + add_message("user", user_.empty() ? user_input : user_, llama_data); int new_len; - if (apply_chat_template_with_error_handling(llama_data, fmtted, true, new_len) < 0) { + if (apply_chat_template_with_error_handling(llama_data, true, new_len) < 0) { return 1; } - std::string prompt(fmtted.begin() + prev_len, fmtted.begin() + new_len); + std::string prompt(llama_data.fmtted.begin() + prev_len, llama_data.fmtted.begin() + new_len); std::string response; if (generate_response(llama_data, prompt, response)) { return 1; } + + if (!user_.empty()) { + break; + } + + add_message("assistant", response, llama_data); + if (apply_chat_template_with_error_handling(llama_data, false, prev_len) < 0) { + return 1; + } } + return 0; } static void log_callback(const enum ggml_log_level level, const char * text, void *) { if (level == GGML_LOG_LEVEL_ERROR) { - fprintf(stderr, "%s", text); + printe("%s", text); } } static bool is_stdin_a_terminal() { #if defined(_WIN32) HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); - DWORD mode; + DWORD mode; return GetConsoleMode(hStdin, &mode); #else return isatty(STDIN_FILENO); @@ -382,17 +705,20 @@ static std::string read_pipe_data() { } int main(int argc, const char ** argv) { - Options opt; - if (parse_arguments(argc, argv, opt)) { + Opt opt; + const int ret = opt.init(argc, argv); + if (ret == 2) { + return 0; + } else if (ret) { return 1; } if (!is_stdin_a_terminal()) { - if (!opt.prompt_non_interactive.empty()) { - opt.prompt_non_interactive += "\n\n"; + if (!opt.user_.empty()) { + opt.user_ += "\n\n"; } - opt.prompt_non_interactive += read_pipe_data(); + opt.user_ += read_pipe_data(); } llama_log_set(log_callback, nullptr); @@ -401,7 +727,7 @@ int main(int argc, const char ** argv) { return 1; } - if (chat_loop(llama_data, opt.prompt_non_interactive)) { + if (chat_loop(llama_data, opt.user_)) { return 1; } From a76c56fa1a3d27467eb97468d8c3b2fe1243b61a Mon Sep 17 00:00:00 2001 From: lhez Date: Fri, 13 Dec 2024 12:23:52 -0800 Subject: [PATCH 016/372] Introducing experimental OpenCL backend with support for Qualcomm Adreno GPUs (#10693) * [cl][adreno] Add Adreno GPU support Add new OpenCL backend to support Adreno GPUs --------- Co-authored-by: Skyler Szot Co-authored-by: Shangqing Gu Co-authored-by: Alexander Angus Co-authored-by: Hongqiang Wang Co-authored-by: Max Krasnyansky * [cl][ci] Add workflow for CL * [cl][adreno] Fix memory leak for non SMALL_ALLOC path * opencl: integrate backend dyn.load interface and fix compiler and format warnings * opencl: remove small-alloc support and fix build errors for non-opencl platforms * opencl: fixed merge conflict (MUSA added twice in cmake) * opencl-ci: use RUNNER_TEMP instead of github.workspace * opencl: fix embed tool invocation with python3 * opencl: CI workflow fixes * opencl: Clean up small-alloc in CMake files * opencl: cleanup ggml-opencl2 header file * opencl: use ulong for offsets and strides in ADD kernel * opencl: use cl_ulong for all offsets * opencl: use cl_ulong for sizes and strides * opencl: use `GGML_LOG_xxx` instead of `fprintf(stderr, ...)` * opencl: rename backend `opencl2` -> `opencl` * opencl: rename kernel files `ggml-opencl2` -> `ggml-opencl` * opencl: make OpenCL required, remove redundant lib and inc directories * `ggml-base`, `..` and `.` are added by `ggml_add_backend_library` * opencl: rename backend - funcs, structs, etc `opencl2` -> `opencl` * opencl: remove copyright marker since main license already covers * opencl: replace some more OPENCL2 leftovers * opencl: remove limits on `tensor_extra` * opencl: use pools for `tensor_extra` * opencl: fix compiler warnings with GCC and Clang Still getting the warning about clCreateCmdQueue being obsolete. Will fix that separately. * opencl: fail gracefully if opencl devices are not available Also for unsupported GPUs. * opencl: fix MSVC builds (string length error) * opencl: check for various requirements, allow deprecated API * opencl: update log message for unsupported GPUs --------- Co-authored-by: Skyler Szot Co-authored-by: Shangqing Gu Co-authored-by: Alexander Angus Co-authored-by: Hongqiang Wang Co-authored-by: Max Krasnyansky --- .github/workflows/build.yml | 26 +- ggml/CMakeLists.txt | 5 + ggml/include/ggml-opencl.h | 26 + ggml/src/CMakeLists.txt | 1 + ggml/src/ggml-backend-reg.cpp | 8 + ggml/src/ggml-opencl/CMakeLists.txt | 147 + ggml/src/ggml-opencl/ggml-opencl.cpp | 4004 +++++++++++++++++ ggml/src/ggml-opencl/kernels/embed_kernel.py | 26 + ggml/src/ggml-opencl/kernels/ggml-opencl.cl | 2683 +++++++++++ .../ggml-opencl/kernels/ggml-opencl_cvt.cl | 106 + .../kernels/ggml-opencl_gemv_noshuffle.cl | 265 ++ .../ggml-opencl_gemv_noshuffle_general.cl | 271 ++ .../src/ggml-opencl/kernels/ggml-opencl_mm.cl | 1225 +++++ .../kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl | 130 + .../kernels/ggml-opencl_transpose_16.cl | 32 + .../kernels/ggml-opencl_transpose_32.cl | 25 + .../kernels/ggml-opencl_transpose_32_16.cl | 35 + 17 files changed, 9014 insertions(+), 1 deletion(-) create mode 100644 ggml/include/ggml-opencl.h create mode 100644 ggml/src/ggml-opencl/CMakeLists.txt create mode 100644 ggml/src/ggml-opencl/ggml-opencl.cpp create mode 100644 ggml/src/ggml-opencl/kernels/embed_kernel.py create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_cvt.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle_general.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_mm.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_16.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32.cl create mode 100644 ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32_16.cl diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 886d33d2d..022d31fb2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -662,6 +662,8 @@ jobs: defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DBUILD_SHARED_LIBS=ON' - build: 'msvc-arm64' defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-msvc.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DBUILD_SHARED_LIBS=ON' + - build: 'llvm-arm64-opencl-adreno' + defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" -DGGML_OPENCL=ON -DGGML_OPENCL_USE_ADRENO_KERNELS=ON' steps: - name: Clone @@ -703,6 +705,28 @@ jobs: run: | choco install ninja + - name: Install OpenCL Headers and Libs + id: install_opencl + if: ${{ matrix.build == 'llvm-arm64-opencl-adreno' }} + run: | + git clone https://github.com/KhronosGroup/OpenCL-Headers + cd OpenCL-Headers + mkdir build && cd build + cmake .. ` + -DBUILD_TESTING=OFF ` + -DOPENCL_HEADERS_BUILD_TESTING=OFF ` + -DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF ` + -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" + cmake --build . --target install + git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader + cd OpenCL-ICD-Loader + mkdir build-arm64-release && cd build-arm64-release + cmake .. ` + -A arm64 ` + -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" ` + -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" + cmake --build . --target install --config release + - name: Build id: cmake_build run: | @@ -732,7 +756,7 @@ jobs: - name: Test id: cmake_test # not all machines have native AVX-512 - if: ${{ matrix.build != 'msvc-arm64' && matrix.build != 'llvm-arm64' && matrix.build != 'kompute-x64' && matrix.build != 'vulkan-x64' && (matrix.build != 'avx512-x64' || env.HAS_AVX512F == '1') }} + if: ${{ matrix.build != 'msvc-arm64' && matrix.build != 'llvm-arm64' && matrix.build != 'llvm-arm64-opencl-adreno' && matrix.build != 'kompute-x64' && matrix.build != 'vulkan-x64' && (matrix.build != 'avx512-x64' || env.HAS_AVX512F == '1') }} run: | cd build ctest -L main -C Release --verbose --timeout 900 diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index c91e93163..3442142ad 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -179,6 +179,11 @@ set (GGML_SYCL_TARGET "INTEL" CACHE STRING set (GGML_SYCL_DEVICE_ARCH "" CACHE STRING "ggml: sycl device architecture") +option(GGML_OPENCL "ggml: use OpenCL" OFF) +option(GGML_OPENCL_PROFILING "ggml: use OpenCL profiling (increases overhead)" OFF) +option(GGML_OPENCL_EMBED_KERNELS "ggml: embed kernels" ON) +option(GGML_OPENCL_USE_ADRENO_KERNELS "ggml: use optimized kernels for Adreno" ON) + # extra artifacts option(GGML_BUILD_TESTS "ggml: build tests" ${GGML_STANDALONE}) option(GGML_BUILD_EXAMPLES "ggml: build examples" ${GGML_STANDALONE}) diff --git a/ggml/include/ggml-opencl.h b/ggml/include/ggml-opencl.h new file mode 100644 index 000000000..6b6177135 --- /dev/null +++ b/ggml/include/ggml-opencl.h @@ -0,0 +1,26 @@ +#ifndef GGML_OPENCL_H +#define GGML_OPENCL_H + +#include "ggml.h" +#include "ggml-backend.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// +// backend API +// +GGML_BACKEND_API ggml_backend_t ggml_backend_opencl_init(void); +GGML_BACKEND_API bool ggml_backend_is_opencl(ggml_backend_t backend); + +GGML_BACKEND_API ggml_backend_buffer_type_t ggml_backend_opencl_buffer_type(void); +GGML_BACKEND_API ggml_backend_buffer_type_t ggml_backend_opencl_host_buffer_type(void); + +GGML_BACKEND_API ggml_backend_reg_t ggml_backend_opencl_reg(void); + +#ifdef __cplusplus +} +#endif + +#endif // GGML_OPENCL_H diff --git a/ggml/src/CMakeLists.txt b/ggml/src/CMakeLists.txt index 349f4c57f..bf5ee5fc2 100644 --- a/ggml/src/CMakeLists.txt +++ b/ggml/src/CMakeLists.txt @@ -308,6 +308,7 @@ ggml_add_backend(MUSA) ggml_add_backend(RPC) ggml_add_backend(SYCL) ggml_add_backend(Vulkan) +ggml_add_backend(OpenCL) foreach (target ggml-base ggml) target_include_directories(${target} PUBLIC $ $) diff --git a/ggml/src/ggml-backend-reg.cpp b/ggml/src/ggml-backend-reg.cpp index b2eded903..66927148a 100644 --- a/ggml/src/ggml-backend-reg.cpp +++ b/ggml/src/ggml-backend-reg.cpp @@ -46,6 +46,10 @@ #include "ggml-vulkan.h" #endif +#ifdef GGML_USE_OPENCL +#include "ggml-opencl.h" +#endif + #ifdef GGML_USE_BLAS #include "ggml-blas.h" #endif @@ -146,6 +150,9 @@ struct ggml_backend_registry { #ifdef GGML_USE_VULKAN register_backend(ggml_backend_vk_reg()); #endif +#ifdef GGML_USE_OPENCL + register_backend(ggml_backend_opencl_reg()); +#endif #ifdef GGML_USE_CANN register_backend(ggml_backend_cann_reg()); #endif @@ -539,6 +546,7 @@ void ggml_backend_load_all_from_path(const char * dir_path) { ggml_backend_load_best("rpc", silent, dir_path); ggml_backend_load_best("sycl", silent, dir_path); ggml_backend_load_best("vulkan", silent, dir_path); + ggml_backend_load_best("opencl", silent, dir_path); ggml_backend_load_best("musa", silent, dir_path); ggml_backend_load_best("cpu", silent, dir_path); } diff --git a/ggml/src/ggml-opencl/CMakeLists.txt b/ggml/src/ggml-opencl/CMakeLists.txt new file mode 100644 index 000000000..45328a657 --- /dev/null +++ b/ggml/src/ggml-opencl/CMakeLists.txt @@ -0,0 +1,147 @@ +find_package(OpenCL REQUIRED) +find_package(Python3 REQUIRED) + +set(TARGET_NAME ggml-opencl) + +ggml_add_backend_library(${TARGET_NAME} + ggml-opencl.cpp + ../../include/ggml-opencl.h) +target_link_libraries(${TARGET_NAME} PRIVATE ${OpenCL_LIBRARIES}) +target_include_directories(${TARGET_NAME} PRIVATE ${OpenCL_INCLUDE_DIRS}) + +if (GGML_OPENCL_PROFILING) + message(STATUS "OpenCL profiling enabled (increases CPU overhead)") + add_compile_definitions(GGML_OPENCL_PROFILING) +endif () + +add_compile_definitions(GGML_OPENCL_SOA_Q) + +if (GGML_OPENCL_USE_ADRENO_KERNELS) + message(STATUS "OpenCL will use matmul kernels optimized for Adreno") + add_compile_definitions(GGML_OPENCL_USE_ADRENO_KERNELS) +endif () + +if (GGML_OPENCL_EMBED_KERNELS) + add_compile_definitions(GGML_OPENCL_EMBED_KERNELS) + + set(OPENCL_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl.cl.h") + set(OPENCL_MM_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mm.cl.h") + set(OPENCL_CVT_CL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_cvt.cl.h") + + set(OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle.cl.h") + set(OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_gemv_noshuffle_general.cl.h") + set(OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_mul_mat_Ab_Bi_8x4.cl.h") + set(OPENCL_TRANSPOSE_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_16.cl.h") + set(OPENCL_TRANSPOSE_32_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32.cl.h") + set(OPENCL_TRANSPOSE_32_16_SOURCE_EMBED "${CMAKE_BINARY_DIR}/autogenerated/ggml-opencl_transpose_32_16.cl.h") + + set(EMBED_KERNEL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/kernels/embed_kernel.py") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/autogenerated") + + include_directories("${CMAKE_BINARY_DIR}/autogenerated") + + # Python must be accessible from command line + add_custom_command( + OUTPUT ${OPENCL_CL_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl.cl + ${OPENCL_CL_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_MM_CL_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mm.cl + ${OPENCL_MM_CL_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_mm.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_mm.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_CVT_CL_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_cvt.cl + ${OPENCL_CVT_CL_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_cvt.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_cvt.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle.cl + ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_gemv_noshuffle.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_gemv_noshuffle.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_gemv_noshuffle_general.cl + ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_gemv_noshuffle_general.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_gemv_noshuffle_general.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl + ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_mul_mat_Ab_Bi_8x4.cl.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_TRANSPOSE_16_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_16.cl + ${OPENCL_TRANSPOSE_16_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_transpose_16.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_transpose_16.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_TRANSPOSE_32_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32.cl + ${OPENCL_TRANSPOSE_32_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_transpose_32.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_transpose_32.cl.h" + ) + + add_custom_command( + OUTPUT ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED} + COMMAND ${Python3_EXECUTABLE} ${EMBED_KERNEL_SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR}/kernels/ggml-opencl_transpose_32_16.cl + ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED} + DEPENDS kernels/ggml-opencl_transpose_32_16.cl ${EMBED_KERNEL_SCRIPT} + COMMENT "Generate ggml-opencl_transpose_32_16.cl.h" + ) + + target_sources(${TARGET_NAME} PRIVATE + ${OPENCL_CL_SOURCE_EMBED} + ${OPENCL_MM_CL_SOURCE_EMBED} + ${OPENCL_CVT_CL_SOURCE_EMBED} + ${OPENCL_GEMV_NOSHUFFLE_SOURCE_EMBED} + ${OPENCL_GEMV_NOSHUFFLE_GENERAL_SOURCE_EMBED} + ${OPENCL_MUL_MAT_Ab_Bi_8x4_SOURCE_EMBED} + ${OPENCL_TRANSPOSE_16_SOURCE_EMBED} + ${OPENCL_TRANSPOSE_32_SOURCE_EMBED} + ${OPENCL_TRANSPOSE_32_16_SOURCE_EMBED}) +else () + # copy ggml-opencl.cl to bin directory + configure_file(kernels/ggml-opencl.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl.cl COPYONLY) + configure_file(kernels/ggml-opencl_mm.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mm.cl COPYONLY) + configure_file(kernels/ggml-opencl_cvt.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_cvt.cl COPYONLY) + + configure_file(kernels/ggml-opencl_gemv_noshuffle.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle.cl COPYONLY) + configure_file(kernels/ggml-opencl_gemv_noshuffle_general.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_gemv_noshuffle_general.cl COPYONLY) + configure_file(kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_mul_mat_Ab_Bi_8x4.cl COPYONLY) + configure_file(kernels/ggml-opencl_transpose_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_16.cl COPYONLY) + configure_file(kernels/ggml-opencl_transpose_32.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32.cl COPYONLY) + configure_file(kernels/ggml-opencl_transpose_32_16.cl ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ggml-opencl_transpose_32_16.cl COPYONLY) +endif () diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp new file mode 100644 index 000000000..c77d629f0 --- /dev/null +++ b/ggml/src/ggml-opencl/ggml-opencl.cpp @@ -0,0 +1,4004 @@ +#define CL_TARGET_OPENCL_VERSION 220 +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS + +// suppress warnings in CL headers for GCC and Clang +#pragma GCC diagnostic ignored "-Woverlength-strings" +#ifdef __clang__ +#pragma GCC diagnostic ignored "-Wgnu-anonymous-struct" +#endif + +#include "ggml-opencl.h" +#include "ggml-backend.h" +#include "ggml-impl.h" +#include "ggml-backend-impl.h" +#include "ggml.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#undef MIN +#undef MAX +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define UNUSED(x) (void)(x) + +#define CL_CHECK(err) \ + do { \ + cl_int err_ = (err); \ + if (err_ != CL_SUCCESS) { \ + GGML_LOG_ERROR("ggml_opencl: %s error %d at %s:%d\n", \ + #err, err_, __FILE__, __LINE__); \ + GGML_ASSERT(0); \ + } \ + } while (0) + +//------------------------------------------------------------------------------ +// OpenCL +//------------------------------------------------------------------------------ + +bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor); + +enum GPU_FAMILY { + ADRENO, + INTEL, + UNKNOWN, +}; + +enum ADRENO_GPU_GEN { + ADRENO_UNKNOWN, + A7X, + A8X, + X1E, +}; + +static ADRENO_GPU_GEN get_adreno_gpu_gen(const char *device_name) { + if (strstr(device_name, "730") || + strstr(device_name, "740") || + strstr(device_name, "750")) { + return ADRENO_GPU_GEN::A7X; + } + + if (strstr(device_name, "830")) { + return ADRENO_GPU_GEN::A8X; + } + + if (strstr(device_name, "X1")) { + return ADRENO_GPU_GEN::X1E; + } + + return ADRENO_GPU_GEN::ADRENO_UNKNOWN; +} + +static int get_adreno_cl_compiler_version(const char *driver_version) { + std::string driver_ver_str(driver_version); + size_t compiler_ver_pos = driver_ver_str.find("E031"); + size_t compiler_ver_len = 13; + size_t compiler_ver_offset = 5; + + if (compiler_ver_pos == std::string::npos) { + compiler_ver_pos = driver_ver_str.find("DX"); + if (compiler_ver_pos == std::string::npos) { + return -1; + } + compiler_ver_len = 11; + compiler_ver_offset = 3; + } + + std::string compiler_ver_str = driver_ver_str.substr(compiler_ver_pos, compiler_ver_len); + std::string major_ver_str = compiler_ver_str.substr(compiler_ver_offset, 2); + return std::atoi(major_ver_str.c_str()); +} + +// backend device context +struct ggml_backend_opencl_device_context { + cl_platform_id platform; + std::string platform_name; + + cl_device_id device; + std::string device_name; +}; + +// backend context +struct ggml_backend_opencl_context { + cl_device_id device; + std::string device_name; + + std::string driver_version; + + GPU_FAMILY gpu_family; + ADRENO_GPU_GEN adreno_gen; + + cl_int alignment; + size_t max_alloc_size; + bool fp16_support; + + int adreno_wave_size; + + cl_context context; + cl_command_queue queue; + + cl_program program; + cl_program program_1; + cl_program program_2; + + cl_kernel kernel_add, kernel_add_row; + cl_kernel kernel_mul, kernel_mul_row; + cl_kernel kernel_scale; + cl_kernel kernel_silu, kernel_silu_4; + cl_kernel kernel_gelu, kernel_gelu_4; + cl_kernel kernel_relu; + cl_kernel kernel_clamp; + cl_kernel kernel_norm; + cl_kernel kernel_rms_norm; + cl_kernel kernel_diag_mask_inf, kernel_diag_mask_inf_8; + cl_kernel kernel_soft_max, kernel_soft_max_4; + cl_kernel kernel_get_rows_f32, kernel_get_rows_f16, kernel_get_rows_q4_0; + cl_kernel kernel_rope_norm_f32, kernel_rope_norm_f16, kernel_rope_neox_f32, kernel_rope_neox_f16; + cl_kernel kernel_cpy_f16_f16, kernel_cpy_f16_f32, kernel_cpy_f32_f16, kernel_cpy_f32_f32; + cl_kernel kernel_mul_mat_f32_f32; + cl_kernel kernel_mul_mat_f16_f16; + cl_kernel kernel_mul_mat_f16_f32_1row; + cl_kernel kernel_mul_mat_f16_f32; + cl_kernel kernel_mul_mat_f16_f32_l4; + cl_kernel kernel_mul_mat_q4_0_f32, kernel_mul_mat_q4_0_f32_v; + cl_kernel kernel_convert_block_q4_0, kernel_restore_block_q4_0, kernel_mul_mat_q4_0_f32_flat; + cl_kernel kernel_mul_mat_q4_0_f32_8x_flat; + cl_kernel kernel_convert_block_q4_0_noshuffle, kernel_mul_mat_q4_0_f32_flat_v0, + kernel_mul_mat_q4_0_f32_flat_img_v0; + cl_kernel kernel_mul_mat_q4_0_f32_1d_8x_flat, kernel_mul_mat_q4_0_f32_1d_16x_flat; + cl_kernel kernel_mul_mv_q6_K_f32; + +#ifdef GGML_OPENCL_USE_ADRENO_KERNELS + // Transpose kernels + cl_program program_transpose_32; + cl_program program_transpose_32_16; + cl_program program_transpose_16; + cl_kernel kernel_transpose_32; + cl_kernel kernel_transpose_32_16; + cl_kernel kernel_transpose_16; + + cl_mem A_s_d_max; // max scale buffer size for transpose + cl_mem A_q_d_max; // max weight buffer size for transpose + cl_mem B_d_max; // max activation buffer size for transpose + + // Gemm and Gemv related programs, kernels, etc + cl_program program_CL_gemm; + cl_program program_CL_gemv_general; + cl_program program_CL_gemv_4096_1_11008; + cl_program program_CL_gemv_4096_1_4096; + cl_program program_CL_gemv_11008_1_4096; + cl_program program_CL_gemv_32000_1_4096; + cl_kernel CL_mul_mat_Ab_Bi_8x4; + cl_kernel CL_mul_mat_vec_q4_0_f32_1d_4x_flat_general; + cl_kernel CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_11008; + cl_kernel CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_4096; + cl_kernel CL_mul_mat_vec_q4_0_f32_1d_4x_flat_11008_1_4096; + cl_kernel CL_mul_mat_vec_q4_0_f32_1d_4x_flat_32000_1_4096; +#endif // GGML_OPENCL_USE_ADRENO_KERNELS +}; + +static ggml_backend_device g_ggml_backend_opencl_device; +static ggml_backend_opencl_device_context g_ggml_ctx_dev_main { + /*.platform =*/ nullptr, + /*.platform_nane =*/ "", + /*.device =*/ nullptr, + /*.device_name =*/ "", +}; + +static int ggml_backend_opencl_n_devices = 0; + +// Profiling +#ifdef GGML_OPENCL_PROFILING +struct ProfilingInfo { + std::string op_name; + std::string kernel_name; + // Kernel execution time in nanoseconds. + cl_ulong duration_ns; + // Global and local work sizes. + size_t global_size[3]; + size_t local_size[3]; + // Op output size. + size_t output_size[4]; +}; + +std::vector g_profiling_info; +#endif + +inline std::string read_file(const std::string &path) { + std::ifstream ifs(path); + if (!ifs) { + return ""; + } + std::string text; + ifs.seekg(0, std::ios::end); + text.resize(ifs.tellg()); + ifs.seekg(0, std::ios::beg); + ifs.read(&text[0], text.size()); + return text; +} + +static cl_program build_program_from_source(cl_context ctx, cl_device_id dev, const char* program_buffer, const std::string &compile_opts) { + cl_program p; + char *program_log; + size_t program_size; + size_t log_size; + int err; + + program_size = strlen(program_buffer); + + p = clCreateProgramWithSource(ctx, 1, (const char**)&program_buffer, &program_size, &err); + if(err < 0) { + GGML_LOG_ERROR("OpenCL error creating program"); + exit(1); + } + + err = clBuildProgram(p, 0, NULL, compile_opts.c_str(), NULL, NULL); + if(err < 0) { + clGetProgramBuildInfo(p, dev, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); + program_log = (char*) malloc(log_size + 1); + program_log[log_size] = '\0'; + clGetProgramBuildInfo(p, dev, CL_PROGRAM_BUILD_LOG, log_size + 1, program_log, NULL); + GGML_LOG_ERROR("ggml_opencl: kernel compile error:\n\n%s\n", program_log); + free(program_log); + exit(1); + } + + return p; +} + +static ggml_backend_opencl_context * ggml_cl2_init(ggml_backend_dev_t dev) { + static bool initialized = false; + static ggml_backend_opencl_context *backend_ctx = nullptr; + + if (initialized) { + return backend_ctx; + } + + ggml_backend_opencl_device_context *dev_ctx = (ggml_backend_opencl_device_context *)dev->context; + GGML_ASSERT(dev_ctx); + GGML_ASSERT(dev_ctx->platform == nullptr); + GGML_ASSERT(dev_ctx->device == nullptr); + GGML_ASSERT(backend_ctx == nullptr); + + initialized = true; + backend_ctx = new ggml_backend_opencl_context(); + backend_ctx->gpu_family = GPU_FAMILY::UNKNOWN; + + cl_int err; + +#ifdef GGML_PROFILE_OPENCL + GGML_LOG_INFO("ggml_opencl: OpenCL profiling enabled\n"); +#endif + + struct cl_device; + struct cl_platform { + cl_platform_id id; + unsigned number; + char name[128]; + char vendor[128]; + struct cl_device * devices; + unsigned n_devices; + struct cl_device * default_device; + }; + + struct cl_device { + struct cl_platform * platform; + cl_device_id id; + unsigned number; + cl_device_type type; + char name[128]; + }; + + enum { NPLAT = 16, NDEV = 16 }; + + struct cl_platform platforms[NPLAT]; + unsigned n_platforms = 0; + struct cl_device devices[NDEV]; + unsigned n_devices = 0; + struct cl_device * default_device = NULL; + + cl_platform_id platform_ids[NPLAT]; + if (clGetPlatformIDs(NPLAT, platform_ids, &n_platforms) != CL_SUCCESS) { + GGML_LOG_ERROR("ggml_opencl: plaform IDs not available.\n"); + return backend_ctx; + } + + for (unsigned i = 0; i < n_platforms; i++) { + struct cl_platform * p = &platforms[i]; + p->number = i; + p->id = platform_ids[i]; + CL_CHECK(clGetPlatformInfo(p->id, CL_PLATFORM_NAME, sizeof(p->name), &p->name, NULL)); + CL_CHECK(clGetPlatformInfo(p->id, CL_PLATFORM_VENDOR, sizeof(p->vendor), &p->vendor, NULL)); + + cl_device_id device_ids[NDEV]; + cl_int clGetDeviceIDsError = clGetDeviceIDs(p->id, CL_DEVICE_TYPE_ALL, NDEV, device_ids, &p->n_devices); + if (clGetDeviceIDsError == CL_DEVICE_NOT_FOUND) { + p->n_devices = 0; + } else { + CL_CHECK(clGetDeviceIDsError); + } + p->devices = p->n_devices > 0 ? &devices[n_devices] : NULL; + p->default_device = NULL; + + for (unsigned j = 0; j < p->n_devices; j++) { + struct cl_device * d = &devices[n_devices]; + d->number = n_devices++; + d->id = device_ids[j]; + d->platform = p; + CL_CHECK(clGetDeviceInfo(d->id, CL_DEVICE_NAME, sizeof(d->name), &d->name, NULL)); + CL_CHECK(clGetDeviceInfo(d->id, CL_DEVICE_TYPE, sizeof(d->type), &d->type, NULL)); + + if (p->default_device == NULL && d->type == CL_DEVICE_TYPE_GPU) { + p->default_device = d; + } + } + + if (default_device == NULL && p->default_device != NULL) { + default_device = p->default_device; + } + } + + if (n_devices == 0) { + GGML_LOG_ERROR("ggml_opencl: could find any OpenCL devices.\n"); + return backend_ctx; + } + + char * user_platform_string = getenv("GGML_OPENCL_PLATFORM"); + char * user_device_string = getenv("GGML_OPENCL_DEVICE"); + int user_platform_number = -1; + int user_device_number = -1; + + unsigned n; + if (user_platform_string != NULL && sscanf(user_platform_string, " %u", &n) == 1 && n < n_platforms) { + user_platform_number = (int)n; + } + if (user_device_string != NULL && sscanf(user_device_string, " %u", &n) == 1 && n < n_devices) { + user_device_number = (int)n; + } + if (user_platform_number != -1 && user_device_number != -1) { + cl_platform* platform = &platforms[user_platform_number]; + if ((unsigned)user_device_number >= platform->n_devices) { + GGML_LOG_ERROR("ggml_opencl: invalid device number %d\n", user_device_number); + exit(1); + } + default_device = &platform->devices[user_device_number]; + } else { + + struct cl_device * selected_devices = devices; + unsigned n_selected_devices = n_devices; + + if (user_platform_number == -1 && user_platform_string != NULL && user_platform_string[0] != 0) { + for (unsigned i = 0; i < n_platforms; i++) { + struct cl_platform * p = &platforms[i]; + if (strstr(p->name, user_platform_string) != NULL || + strstr(p->vendor, user_platform_string) != NULL) { + user_platform_number = (int)i; + break; + } + } + if (user_platform_number == -1) { + GGML_LOG_ERROR("ggml_opencl: no platform matching '%s' was found.\n", user_platform_string); + exit(1); + } + } + if (user_platform_number != -1) { + struct cl_platform * p = &platforms[user_platform_number]; + selected_devices = p->devices; + n_selected_devices = p->n_devices; + default_device = p->default_device; + if (n_selected_devices == 0) { + GGML_LOG_ERROR("ggml_opencl: selected platform '%s' does not have any devices.\n", p->name); + exit(1); + } + } + + if (user_device_number == -1 && user_device_string != NULL && user_device_string[0] != 0) { + for (unsigned i = 0; i < n_selected_devices; i++) { + struct cl_device * d = &selected_devices[i]; + if (strstr(d->name, user_device_string) != NULL) { + user_device_number = d->number; + break; + } + } + if (user_device_number == -1) { + GGML_LOG_ERROR("ggml_opencl: no device matching '%s' was found.\n", user_device_string); + exit(1); + } + } + if (user_device_number != -1) { + selected_devices = &devices[user_device_number]; + n_selected_devices = 1; + default_device = &selected_devices[0]; + } + + GGML_ASSERT(n_selected_devices > 0); + + if (default_device == NULL) { + default_device = &selected_devices[0]; + } + } + + GGML_LOG_INFO("ggml_opencl: selecting platform: '%s'\n", default_device->platform->name); + GGML_LOG_INFO("ggml_opencl: selecting device: '%s'\n", default_device->name); + if (default_device->type != CL_DEVICE_TYPE_GPU) { + GGML_LOG_WARN("ggml_opencl: warning, not a GPU: '%s'.\n", default_device->name); + } + + dev_ctx->platform = default_device->platform->id; + dev_ctx->device = default_device->id; + backend_ctx->device = default_device->id; + + if (strstr(default_device->name, "Adreno")) { + backend_ctx->gpu_family = GPU_FAMILY::ADRENO; + backend_ctx->adreno_gen = get_adreno_gpu_gen(default_device->name); + + // Default wave size is 128, A8x uses 64. + if (backend_ctx->adreno_gen == ADRENO_GPU_GEN::A8X) { + backend_ctx->adreno_wave_size = 64; + } else if (backend_ctx->adreno_gen == ADRENO_GPU_GEN::A7X || + backend_ctx->adreno_gen == ADRENO_GPU_GEN::X1E) { + backend_ctx->adreno_wave_size = 128; + } else { + backend_ctx->adreno_wave_size = 128; + GGML_LOG_WARN("ggml_opencl: Unsupported Adreno GPU: %s, " + "using wave size %d, " + "may not work as expected\n", + backend_ctx->device_name.c_str(), backend_ctx->adreno_wave_size); + } + } else if (strstr(default_device->name, "Intel")) { + backend_ctx->gpu_family = GPU_FAMILY::INTEL; + } else { + GGML_LOG_ERROR("Unsupported GPU: %s\n", default_device->name); + backend_ctx->gpu_family = GPU_FAMILY::UNKNOWN; + return backend_ctx; + } + +#ifdef GGML_OPENCL_USE_ADRENO_KERNELS + if (backend_ctx->gpu_family != GPU_FAMILY::ADRENO) { + GGML_LOG_ERROR("ggml_opencl: Adreno-specific kernels should not be enabled for non-Adreno GPUs; " + "run on an Adreno GPU or recompile with CMake option `-DGGML_OPENCL_USE_ADRENO_KERNELS=OFF`\n"); + return backend_ctx; + } +#endif + + // Populate backend device name + dev_ctx->platform_name = default_device->platform->name; + dev_ctx->device_name = default_device->name; + backend_ctx->device_name = default_device->name; + + // A local ref of cl_device_id for convenience + cl_device_id device = backend_ctx->device; + + // Check device OpenCL version, OpenCL 2.0 or above is required + size_t device_ver_str_size; + clGetDeviceInfo(device, CL_DEVICE_VERSION, 0, NULL, &device_ver_str_size); + char *device_ver_buffer = (char *)alloca(device_ver_str_size + 1); + clGetDeviceInfo(device, CL_DEVICE_VERSION, device_ver_str_size, device_ver_buffer, NULL); + device_ver_buffer[device_ver_str_size] = '\0'; + GGML_LOG_INFO("ggml_opencl: device OpenCL version: %s\n", device_ver_buffer); + + if (strstr(device_ver_buffer, "OpenCL 2") == NULL && + strstr(device_ver_buffer, "OpenCL 3") == NULL) { + GGML_LOG_ERROR("ggml_opencl: OpenCL 2.0 or above is required\n"); + return backend_ctx; + } + + // Check driver version + size_t driver_version_str_size; + clGetDeviceInfo(device, CL_DRIVER_VERSION, 0, NULL, &driver_version_str_size); + char *driver_version = (char *)alloca(driver_version_str_size + 1); + clGetDeviceInfo(device, CL_DRIVER_VERSION, driver_version_str_size, driver_version, NULL); + driver_version[driver_version_str_size] = '\0'; + GGML_LOG_INFO("ggml_opencl: OpenCL driver: %s\n", driver_version); + backend_ctx->driver_version = driver_version; + + int adreno_cl_compiler_version = get_adreno_cl_compiler_version(driver_version); + bool has_vector_subgroup_broadcast = + adreno_cl_compiler_version >= 47 || adreno_cl_compiler_version == 17; + GGML_LOG_INFO("ggml_opencl: vector subgroup broadcast support: %s\n", + has_vector_subgroup_broadcast ? "true" : "false"); + + size_t ext_str_size; + clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, 0, NULL, &ext_str_size); + char *ext_buffer = (char *)alloca(ext_str_size + 1); + clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, ext_str_size, ext_buffer, NULL); + ext_buffer[ext_str_size] = '\0'; // ensure it is null terminated + // Check if ext_buffer contains cl_khr_fp16 + backend_ctx->fp16_support = strstr(ext_buffer, "cl_khr_fp16") != NULL; + GGML_LOG_INFO("ggml_opencl: device FP16 support: %s\n", backend_ctx->fp16_support ? "true" : "false"); + + // fp16 is required + if (!backend_ctx->fp16_support) { + GGML_LOG_ERROR("ggml_opencl: device does not support FP16\n"); + return backend_ctx; + } + + // If OpenCL 3.0 is supported, then check for cl_khr_subgroups, which becomes + // optional in OpenCL 3.0 (cl_khr_subgroup is mandatory in OpenCL 2.x) + if (strstr(device_ver_buffer, "OpenCL 3") && + strstr(ext_buffer, "cl_khr_subgroups") == NULL && + strstr(ext_buffer, "cl_intel_subgroups") == NULL) { + GGML_LOG_ERROR("ggml_opencl: device does not support subgroups (cl_khr_subgroups or cl_intel_subgroups) " + "(note that subgroups is an optional feature in OpenCL 3.0)\n"); + return backend_ctx; + } + + CL_CHECK(clGetDeviceInfo(device, CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof(cl_uint), &backend_ctx->alignment, NULL)); + GGML_LOG_INFO("ggml_opencl: mem base addr align: %u\n", backend_ctx->alignment); + + clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(size_t), &backend_ctx->max_alloc_size, NULL); + GGML_LOG_INFO("ggml_opencl: max mem alloc size: %zu MB\n", backend_ctx->max_alloc_size/1024/1024); + + // Check SVM. + cl_device_svm_capabilities svm_caps; + CL_CHECK(clGetDeviceInfo(device, CL_DEVICE_SVM_CAPABILITIES, sizeof(cl_device_svm_capabilities), &svm_caps, 0)); + GGML_LOG_INFO("ggml_opencl: SVM coarse grain buffer support: %s\n", + svm_caps & CL_DEVICE_SVM_COARSE_GRAIN_BUFFER ? "true" : "false"); + GGML_LOG_INFO("ggml_opencl: SVM fine grain buffer support: %s\n", + svm_caps & CL_DEVICE_SVM_FINE_GRAIN_BUFFER ? "true" : "false"); + GGML_LOG_INFO("ggml_opencl: SVM fine grain system support: %s\n", + svm_caps & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM ? "true" : "false"); + GGML_LOG_INFO("ggml_opencl: SVM atomics support: %s\n", + svm_caps & CL_DEVICE_SVM_ATOMICS ? "true" : "false"); + + // Print out configurations +#ifdef GGML_OPENCL_SOA_Q + GGML_LOG_INFO("ggml_opencl: flattening quantized weights representation as struct of arrays (GGML_OPENCL_SOA_Q)\n"); +#endif // GGML_OPENCL_SOA_Q + +#ifdef GGML_OPENCL_USE_ADRENO_KERNELS + GGML_LOG_INFO("ggml_opencl: using kernels optimized for Adreno (GGML_OPENCL_USE_ADRENO_KERNELS)\n"); +#endif // GGML_OPENCL_USE_ADRENO_KERNELS + + cl_context_properties properties[] = { + (intptr_t)CL_CONTEXT_PLATFORM, (intptr_t)dev_ctx->platform, 0 + }; + + CL_CHECK((backend_ctx->context = clCreateContext(properties, 1, &device, NULL, NULL, &err), err)); + + // A local ref of cl_context for convenience + cl_context context = backend_ctx->context; + + //CL_CHECK((queue = clCreateCommandQueue(context, device, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err), + // (err != CL_INVALID_QUEUE_PROPERTIES && err != CL_INVALID_VALUE ? err : + // (queue = clCreateCommandQueue(context, device, 0, &err), err) + //))); + cl_command_queue_properties command_queue_props = 0; +#ifdef GGML_OPENCL_PROFILING + command_queue_props |= CL_QUEUE_PROFILING_ENABLE; +#endif + CL_CHECK((backend_ctx->queue = clCreateCommandQueue(context, device, command_queue_props, &err), err)); + +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src { + #include "ggml-opencl.cl.h" + }; +#else + const std::string kernel_src = read_file("ggml-opencl.cl"); +#endif + + std::string compile_opts = + "-cl-std=CL2.0 -cl-mad-enable -cl-unsafe-math-optimizations " + "-cl-finite-math-only -cl-fast-relaxed-math "; + backend_ctx->program = build_program_from_source(context, device, kernel_src.c_str(), compile_opts); + + // Non matmul kernels. + CL_CHECK((backend_ctx->kernel_get_rows_f32 = clCreateKernel(backend_ctx->program, "kernel_get_rows_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_get_rows_f16 = clCreateKernel(backend_ctx->program, "kernel_get_rows_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_get_rows_q4_0 = clCreateKernel(backend_ctx->program, "kernel_get_rows_q4_0", &err), err)); + CL_CHECK((backend_ctx->kernel_add = clCreateKernel(backend_ctx->program, "kernel_add", &err), err)); + CL_CHECK((backend_ctx->kernel_add_row = clCreateKernel(backend_ctx->program, "kernel_add_row", &err), err)); + CL_CHECK((backend_ctx->kernel_mul = clCreateKernel(backend_ctx->program, "kernel_mul", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_row = clCreateKernel(backend_ctx->program, "kernel_mul_row", &err), err)); + CL_CHECK((backend_ctx->kernel_scale = clCreateKernel(backend_ctx->program, "kernel_scale", &err), err)); + CL_CHECK((backend_ctx->kernel_silu = clCreateKernel(backend_ctx->program, "kernel_silu", &err), err)); + CL_CHECK((backend_ctx->kernel_silu_4 = clCreateKernel(backend_ctx->program, "kernel_silu_4", &err), err)); + CL_CHECK((backend_ctx->kernel_gelu = clCreateKernel(backend_ctx->program, "kernel_gelu", &err), err)); + CL_CHECK((backend_ctx->kernel_gelu_4 = clCreateKernel(backend_ctx->program, "kernel_gelu_4", &err), err)); + CL_CHECK((backend_ctx->kernel_relu = clCreateKernel(backend_ctx->program, "kernel_relu", &err), err)); + CL_CHECK((backend_ctx->kernel_clamp = clCreateKernel(backend_ctx->program, "kernel_clamp", &err), err)); + CL_CHECK((backend_ctx->kernel_norm = clCreateKernel(backend_ctx->program, "kernel_norm", &err), err)); + CL_CHECK((backend_ctx->kernel_rms_norm = clCreateKernel(backend_ctx->program, "kernel_rms_norm", &err), err)); + CL_CHECK((backend_ctx->kernel_diag_mask_inf = clCreateKernel(backend_ctx->program, "kernel_diag_mask_inf", &err), err)); + CL_CHECK((backend_ctx->kernel_diag_mask_inf_8 = clCreateKernel(backend_ctx->program, "kernel_diag_mask_inf_8", &err), err)); + CL_CHECK((backend_ctx->kernel_soft_max = clCreateKernel(backend_ctx->program, "kernel_soft_max", &err), err)); + CL_CHECK((backend_ctx->kernel_soft_max_4 = clCreateKernel(backend_ctx->program, "kernel_soft_max_4", &err), err)); + CL_CHECK((backend_ctx->kernel_rope_norm_f32 = clCreateKernel(backend_ctx->program, "kernel_rope_norm_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_rope_norm_f16 = clCreateKernel(backend_ctx->program, "kernel_rope_norm_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_rope_neox_f32 = clCreateKernel(backend_ctx->program, "kernel_rope_neox_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_rope_neox_f16 = clCreateKernel(backend_ctx->program, "kernel_rope_neox_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_cpy_f16_f16 = clCreateKernel(backend_ctx->program, "kernel_cpy_f16_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_cpy_f16_f32 = clCreateKernel(backend_ctx->program, "kernel_cpy_f16_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_cpy_f32_f16 = clCreateKernel(backend_ctx->program, "kernel_cpy_f32_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_cpy_f32_f32 = clCreateKernel(backend_ctx->program, "kernel_cpy_f32_f32", &err), err)); + + // Matmul kernels. + CL_CHECK((backend_ctx->kernel_mul_mat_f32_f32 = clCreateKernel(backend_ctx->program, "kernel_mul_mat_f32_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_f16_f16 = clCreateKernel(backend_ctx->program, "kernel_mul_mat_f16_f16", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_f16_f32_1row = clCreateKernel(backend_ctx->program, "kernel_mul_mat_f16_f32_1row", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_f16_f32 = clCreateKernel(backend_ctx->program, "kernel_mul_mat_f16_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_f16_f32_l4 = clCreateKernel(backend_ctx->program, "kernel_mul_mat_f16_f32_l4", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32 = clCreateKernel(backend_ctx->program, "kernel_mul_mat_q4_0_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_v = clCreateKernel(backend_ctx->program, "kernel_mul_mat_q4_0_f32_v", &err), err)); + + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_flat = clCreateKernel(backend_ctx->program, "kernel_mul_mat_q4_0_f32_flat", &err), err)); + CL_CHECK((backend_ctx->kernel_convert_block_q4_0 = clCreateKernel(backend_ctx->program, "kernel_convert_block_q4_0", &err), err)); + CL_CHECK((backend_ctx->kernel_restore_block_q4_0 = clCreateKernel(backend_ctx->program, "kernel_restore_block_q4_0", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_8x_flat = clCreateKernel(backend_ctx->program, "kernel_mul_mat_q4_0_f32_8x_flat", &err), err)); + + // Load additional mulmat kernels. +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src_1 { + #include "ggml-opencl_mm.cl.h" + }; +#else + const std::string kernel_src_1 = read_file("ggml-opencl_mm.cl"); +#endif + backend_ctx->program_1 = build_program_from_source(context, device, kernel_src_1.c_str(), compile_opts); + + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_1d_8x_flat = clCreateKernel(backend_ctx->program_1, "kernel_mul_mat_q4_0_f32_1d_8x_flat", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_1d_16x_flat = clCreateKernel(backend_ctx->program_1, "kernel_mul_mat_q4_0_f32_1d_16x_flat", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mv_q6_K_f32 = clCreateKernel(backend_ctx->program_1, "kernel_mul_mv_q6_K_f32", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_flat_v0 = clCreateKernel(backend_ctx->program_1, "kernel_mul_mat_q4_0_f32_flat_v0", &err), err)); + CL_CHECK((backend_ctx->kernel_mul_mat_q4_0_f32_flat_img_v0 = clCreateKernel(backend_ctx->program_1, "kernel_mul_mat_q4_0_f32_flat_img_v0", &err), err)); + + // Load additional data conversion kernels. +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src_2 { + #include "ggml-opencl_cvt.cl.h" + }; +#else + const std::string kernel_src_2 = read_file("ggml-opencl_cvt.cl"); +#endif + backend_ctx->program_2 = build_program_from_source(context, device, kernel_src_2.c_str(), compile_opts); + + CL_CHECK((backend_ctx->kernel_convert_block_q4_0_noshuffle = clCreateKernel(backend_ctx->program_2, "kernel_convert_block_q4_0_noshuffle", &err), err)); + + // Kernels for Adreno +#ifdef GGML_OPENCL_USE_ADRENO_KERNELS +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string transpose_32_src { + #include "ggml-opencl_transpose_32.cl.h" + }; +#else + const std::string transpose_32_src = read_file("ggml-opencl_transpose_32.cl"); +#endif + backend_ctx->program_transpose_32 = build_program_from_source(context, device, transpose_32_src.c_str(), compile_opts); + CL_CHECK((backend_ctx->kernel_transpose_32 = clCreateKernel(backend_ctx->program_transpose_32, "kernel_transpose_32", &err), err)); + +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string transpose_32_16_src { + #include "ggml-opencl_transpose_32_16.cl.h" + }; +#else + const std::string transpose_32_16_src = read_file("ggml-opencl_transpose_32_16.cl"); +#endif + backend_ctx->program_transpose_32_16 = build_program_from_source(context, device, transpose_32_16_src.c_str(), compile_opts); + CL_CHECK((backend_ctx->kernel_transpose_32_16 = clCreateKernel(backend_ctx->program_transpose_32_16, "kernel_transpose_32_16", &err), err)); + +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string transpose_16_src { + #include "ggml-opencl_transpose_16.cl.h" + }; +#else + const std::string transpose_16_src = read_file("ggml-opencl_transpose_16.cl"); +#endif + backend_ctx->program_transpose_16 = build_program_from_source(context, device, transpose_16_src.c_str(), compile_opts); + CL_CHECK((backend_ctx->kernel_transpose_16 = clCreateKernel(backend_ctx->program_transpose_16, "kernel_transpose_16", &err), err)); + + // Gemv general + std::string CL_gemv_compile_opts = + " -cl-std=CL2.0 " + " -cl-mad-enable " + " -DSIMDGROUP_WIDTH=" + std::to_string(backend_ctx->adreno_wave_size); + if (has_vector_subgroup_broadcast) { + CL_gemv_compile_opts += " -DVECTOR_SUB_GROUP_BROADCAT "; + } +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src_CL_gemv_general { + #include "ggml-opencl_gemv_noshuffle_general.cl.h" + }; +#else + const std::string kernel_src_CL_gemv_general = read_file("ggml-opencl_gemv_noshuffle_general.cl"); +#endif + + backend_ctx->program_CL_gemv_general = build_program_from_source( + context, device, kernel_src_CL_gemv_general.c_str(), CL_gemv_compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_general = clCreateKernel(backend_ctx->program_CL_gemv_general, "kernel_gemv_noshuffle", &err), err)); + + // Gemv 2048, 16384 + CL_gemv_compile_opts = + " -cl-std=CL2.0 " + " -cl-mad-enable " + " -DLINE_STRIDE_A=2048 " + " -DBLOCK_STRIDE_A=16384 " + " -DSIMDGROUP_WIDTH=" + std::to_string(backend_ctx->adreno_wave_size); + if (has_vector_subgroup_broadcast) { + CL_gemv_compile_opts += " -DVECTOR_SUB_GROUP_BROADCAT "; + } +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src_CL_gemv { + #include "ggml-opencl_gemv_noshuffle.cl.h" + }; +#else + const std::string kernel_src_CL_gemv = read_file("ggml-opencl_gemv_noshuffle.cl"); +#endif + + backend_ctx->program_CL_gemv_4096_1_4096 = build_program_from_source( + context, device, kernel_src_CL_gemv.c_str(), CL_gemv_compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_4096 = clCreateKernel(backend_ctx->program_CL_gemv_4096_1_4096, "kernel_gemv_noshuffle", &err), err)); + + // Gemv 2048, 16384 + CL_gemv_compile_opts = + " -cl-std=CL2.0 " + " -cl-mad-enable " + " -DLINE_STRIDE_A=2048 " + " -DBLOCK_STRIDE_A=16384 " + " -DSIMDGROUP_WIDTH=" + std::to_string(backend_ctx->adreno_wave_size); + if (has_vector_subgroup_broadcast) { + CL_gemv_compile_opts += " -DVECTOR_SUB_GROUP_BROADCAT "; + } + + backend_ctx->program_CL_gemv_4096_1_11008 = build_program_from_source( + context, device, kernel_src_CL_gemv.c_str(), CL_gemv_compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_11008 = clCreateKernel(backend_ctx->program_CL_gemv_4096_1_11008, "kernel_gemv_noshuffle", &err), err)); + + // Gemv 5504, 44032 + CL_gemv_compile_opts = + " -cl-std=CL2.0 " + " -cl-mad-enable " + " -DLINE_STRIDE_A=5504 " + " -DBLOCK_STRIDE_A=44032 " + " -DSIMDGROUP_WIDTH=" + std::to_string(backend_ctx->adreno_wave_size); + if (has_vector_subgroup_broadcast) { + CL_gemv_compile_opts += " -DVECTOR_SUB_GROUP_BROADCAT "; + } + + backend_ctx->program_CL_gemv_11008_1_4096 = build_program_from_source( + context, device, kernel_src_CL_gemv.c_str(), CL_gemv_compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_11008_1_4096 = clCreateKernel(backend_ctx->program_CL_gemv_11008_1_4096, "kernel_gemv_noshuffle", &err), err)); + + // Gemv 16000, 128000 + CL_gemv_compile_opts = + " -cl-std=CL2.0 " + " -cl-mad-enable " + " -DLINE_STRIDE_A=16000 " + " -DBLOCK_STRIDE_A=128000 " + " -DSIMDGROUP_WIDTH=" + std::to_string(backend_ctx->adreno_wave_size); + if (has_vector_subgroup_broadcast) { + CL_gemv_compile_opts += " -DVECTOR_SUB_GROUP_BROADCAT "; + } + + backend_ctx->program_CL_gemv_32000_1_4096 = build_program_from_source(context, device, kernel_src_CL_gemv.c_str(), CL_gemv_compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_32000_1_4096 = clCreateKernel(backend_ctx->program_CL_gemv_32000_1_4096, "kernel_gemv_noshuffle", &err), err)); + + // Gemm +#ifdef GGML_OPENCL_EMBED_KERNELS + const std::string kernel_src_CL_gemm { + #include "ggml-opencl_mul_mat_Ab_Bi_8x4.cl.h" + }; +#else + const std::string kernel_src_CL_gemm = read_file("ggml-opencl_mul_mat_Ab_Bi_8x4.cl"); +#endif + backend_ctx->program_CL_gemm = build_program_from_source(context, device, kernel_src_CL_gemm.c_str(), compile_opts); + CL_CHECK((backend_ctx->CL_mul_mat_Ab_Bi_8x4 = clCreateKernel(backend_ctx->program_CL_gemm, "kernel_mul_mat_Ab_Bi_8x4", &err), err)); + + // Allocate intermediate buffers and images + size_t max_A_q_d_bytes = 311164928; + size_t max_A_s_d_bytes = 38895616; + size_t max_B_d_bytes = 45088768; + + CL_CHECK((backend_ctx->A_q_d_max = clCreateBuffer(context, 0, max_A_q_d_bytes, NULL, &err), err)); + CL_CHECK((backend_ctx->A_s_d_max = clCreateBuffer(context, 0, max_A_s_d_bytes, NULL, &err), err)); + CL_CHECK((backend_ctx->B_d_max = clCreateBuffer(context, 0, max_B_d_bytes, NULL, &err), err)); +#endif // GGML_OPENCL_USE_ADRENO_KERNELS + + // For now we support a single devices + ggml_backend_opencl_n_devices = 1; + + return backend_ctx; +} + +static void ggml_cl2_free(void) { +#ifdef GGML_OPENCL_PROFILING + FILE * fperf = fopen("cl_profiling.csv", "w"); + if (!fperf) { + GGML_LOG_ERROR("Failed to open cl_profiling.csv\n"); + return; + } + + float total_kernel_time = 0; + fprintf(fperf, "op name, kernel name, duration (ms), global size, local size, output size\n"); + for (const ProfilingInfo & info : g_profiling_info) { + total_kernel_time += info.duration_ns/1.e6f; + fprintf(fperf, "%s,%s,%f,%zux%zux%zu,%zux%zux%zu,%zux%zux%zux%zu\n", + info.op_name.c_str(), info.kernel_name.c_str(), info.duration_ns/1.e6f, + info.global_size[0], info.global_size[1], info.global_size[2], + info.local_size[0], info.local_size[2], info.local_size[2], + info.output_size[0], info.output_size[1], info.output_size[2], info.output_size[3]); + } + fclose(fperf); + + GGML_LOG_INFO("ggml_opencl: total kernel time: %f\n", total_kernel_time); +#endif +} + +//------------------------------------------------------------------------------ +// Tensor extra management +//------------------------------------------------------------------------------ +struct ggml_tensor_extra_cl { + // The buffer object that holds the data. + cl_mem data_device; + // The offset into the buffer object. This is primarily for scratch buffer + // and view operation. + // NB: this offset no longer includes view offset (view_offs). Whenever this + // offset is used, view_offs should be considered. + cl_ulong offset; + // The actual size of the cl_mem object. This is needed when returning the + // block to the pool. + size_t actual_size; + + void reset() { + data_device = nullptr; + offset = 0; + actual_size = 0; + } +}; + +// Additional tensor extra structs for quantized tensors. +// These tensors are loaded from files and should not be allocated in scratch -- +// they should always be allocated from the pool. Hence, they do not have an +// `offset`, which indicate their locations in the scratch buffer. +struct ggml_tensor_extra_cl_q4_0 { + // Quantized values. + cl_mem q = nullptr; + // Quantized values in image1d_buffer_t. + cl_mem q_img = nullptr; + // Scales. + cl_mem d = nullptr; + // Scales in image1d_buffer_t. + cl_mem d_img = nullptr; + // Size of quantized values. + size_t size_q = 0; + // Size of scales. + size_t size_d = 0; + + ~ggml_tensor_extra_cl_q4_0() { + reset(); + } + + void reset() { + // q and d are subbuffers into the bigger buffer allocated in ggml_backend_buffer. + // They must be properly released so that the original buffer can be + // properly released to avoid memory leak. + if (q != nullptr) { + CL_CHECK(clReleaseMemObject(q)); + q = nullptr; + } + if (d != nullptr) { + CL_CHECK(clReleaseMemObject(d)); + d = nullptr; + } + // Currently, q_img and d_img are only initialized when SMALL_ALLOC is + // enabled. They point to the images in ggml_backend_opencl_buffer_context. + // So, there is no need to release them here. + // TODO: initialize them for non SMALL_PATH path, or remove them. + q_img = nullptr; + d_img = nullptr; + size_q = 0; + size_d = 0; + } +}; + +//------------------------------------------------------------------------------ +// Backend API +//------------------------------------------------------------------------------ + +// +// backend +// +static const char * ggml_backend_opencl_name(ggml_backend_t backend) { + return "OpenCL"; + + UNUSED(backend); +} + +static void ggml_backend_opencl_free(ggml_backend_t backend) { + ggml_cl2_free(); + + GGML_UNUSED(backend); +} + +static void ggml_backend_opencl_set_tensor_async(ggml_backend_t backend, ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + GGML_UNUSED(backend); + GGML_UNUSED(tensor); + GGML_UNUSED(data); + GGML_UNUSED(offset); + GGML_UNUSED(size); +} + +static void ggml_backend_opencl_get_tensor_async(ggml_backend_t backend, const ggml_tensor * tensor, void * data, size_t offset, size_t size) { + GGML_UNUSED(backend); + GGML_UNUSED(tensor); + GGML_UNUSED(data); + GGML_UNUSED(offset); + GGML_UNUSED(size); +} + +static bool ggml_backend_opencl_cpy_tensor_async(ggml_backend_t backend, const ggml_tensor * src, ggml_tensor * dst) { + GGML_UNUSED(backend); + GGML_UNUSED(src); + GGML_UNUSED(dst); + return false; +} + +static void ggml_backend_opencl_synchronize(ggml_backend_t backend) { + GGML_UNUSED(backend); +} + +static ggml_status ggml_backend_opencl_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) { + for (int i = 0; i < cgraph->n_nodes; i++) { + ggml_tensor * node = cgraph->nodes[i]; + + if (node->op == GGML_OP_RESHAPE || node->op == GGML_OP_TRANSPOSE || node->op == GGML_OP_VIEW || node->op == GGML_OP_PERMUTE || node->op == GGML_OP_NONE) { + continue; + } + + bool ok = ggml_cl_compute_forward(backend, node); + if (!ok) { + GGML_LOG_ERROR("%s: error: op not supported %s (%s)\n", __func__, node->name, ggml_op_name(node->op)); + } + GGML_ASSERT(ok); + } + + return GGML_STATUS_SUCCESS; +} + +static bool ggml_opencl_supports_op(ggml_backend_dev_t dev, const struct ggml_tensor * op) { + GGML_UNUSED(dev); + + switch (op->op) { + case GGML_OP_NONE: + return true; + case GGML_OP_GET_ROWS: + switch (op->src[0]->type) { + case GGML_TYPE_F32: + case GGML_TYPE_F16: + return true; + case GGML_TYPE_Q4_0: +#ifdef GGML_OPENCL_SOA_Q + // We do not support flattened Q4_0 (and possibly other Q's) + return false; +#else // GGML_OPENCL_SOA_Q + return true; +#endif // GGML_OPENCL_SOA_Q + default: + return false; + } + case GGML_OP_CPY: + case GGML_OP_DUP: + case GGML_OP_CONT: + switch (op->src[0]->type) { + case GGML_TYPE_F32: + switch (op->type) { + case GGML_TYPE_F16: + case GGML_TYPE_F32: + return true; + default: + return false; + } + case GGML_TYPE_F16: + switch (op->type) { + case GGML_TYPE_F16: + case GGML_TYPE_F32: + return true; + default: + return false; + } + default: + return false; + } + case GGML_OP_ADD: + case GGML_OP_SCALE: + case GGML_OP_MUL: + return true; + case GGML_OP_UNARY: + switch (ggml_get_unary_op(op)) { + case GGML_UNARY_OP_GELU: + case GGML_UNARY_OP_SILU: + case GGML_UNARY_OP_RELU: + return ggml_is_contiguous(op->src[0]); + default: + return false; + } + case GGML_OP_CLAMP: + case GGML_OP_SOFT_MAX: + case GGML_OP_NORM: + case GGML_OP_RMS_NORM: + return true; + case GGML_OP_MUL_MAT: + if (op->src[0]->type == GGML_TYPE_F16) { + return true; + } else if (op->src[0]->type == GGML_TYPE_F32) { + return op->src[1]->type == GGML_TYPE_F32 && ggml_is_contiguous(op->src[0]) && ggml_is_contiguous(op->src[1]); + } else if (op->src[0]->type == GGML_TYPE_Q4_0 || + op->src[0]->type == GGML_TYPE_Q6_K) { + return op->src[1]->type == GGML_TYPE_F32 && ggml_is_contiguous(op->src[0]) && ggml_is_contiguous(op->src[1]); + } + return false; + case GGML_OP_RESHAPE: + case GGML_OP_VIEW: + case GGML_OP_PERMUTE: + case GGML_OP_TRANSPOSE: + return true; + case GGML_OP_DIAG_MASK_INF: + return op->ne[3] == 1; + case GGML_OP_ROPE: + return true; + default: + return false; + } +} + +// Forward declaration - implementation appears later in the file. +static const char * ggml_backend_opencl_buffer_type_get_name(ggml_backend_buffer_type_t buffer_type); + +static ggml_guid_t ggml_backend_opencl_guid() { + static ggml_guid guid = { 0xde, 0xe0, 0x70, 0xa2, 0x73, 0x4e, 0x4d, 0xbc, 0xb0, 0xc7, 0x4f, 0xd4, 0x6d, 0x4e, 0x90, 0xfe }; + return &guid; +} + +static ggml_backend_i ggml_backend_opencl_i = { + /* .get_name = */ ggml_backend_opencl_name, + /* .free = */ ggml_backend_opencl_free, + /* .set_tensor_async = */ NULL, /* ggml_backend_opencl_set_tensor_async */ + /* .get_tensor_async = */ NULL, /* ggml_backend_opencl_get_tensor_async */ + /* .cpy_tensor_async = */ NULL, /* ggml_backend_opencl_cpy_tensor_async */ + /* .synchronize = */ NULL, /* ggml_backend_opencl_synchronize */ + /* .graph_plan_create = */ NULL, + /* .graph_plan_free = */ NULL, + /* .graph_plan_update = */ NULL, + /* .graph_plan_compute = */ NULL, + /* .graph_compute = */ ggml_backend_opencl_graph_compute, + /* .event_record = */ NULL, + /* .event_wait = */ NULL, +}; + +ggml_backend_t ggml_backend_opencl_init(void) { + ggml_backend_dev_t dev = ggml_backend_reg_dev_get(ggml_backend_opencl_reg(), 0); + ggml_backend_opencl_context *backend_ctx = ggml_cl2_init(dev); + + ggml_backend_t backend = new ggml_backend { + /* .guid = */ ggml_backend_opencl_guid(), + /* .interface = */ ggml_backend_opencl_i, + /* .device = */ dev, + /* .context = */ backend_ctx + }; + + return backend; +} + +bool ggml_backend_is_opencl(ggml_backend_t backend) { + return backend && backend->iface.get_name == ggml_backend_opencl_name; +} + +// +// buffer +// +struct ggml_backend_opencl_buffer_context { + // A buffer context can hold multiple cl_mem objects. This is for flattening + // quantized weights and should be used with GGML_OPENCL_SMALL_ALLOC where + // each tensor is allocated a separate buffer. When flattening is enabled + // with small allocation, each tensor is backed by two cl_mem objects (for + // quants and scales) packed into a backend_opencl_buffer. + ggml_backend_opencl_buffer_context(cl_mem buf) + : name("OpenCL") { + buffer.push_back(buf); + } + + ~ggml_backend_opencl_buffer_context() { + for (cl_mem buf : buffer) { + CL_CHECK(clReleaseMemObject(buf)); + } + for (cl_mem im : img) { + CL_CHECK(clReleaseMemObject(im)); + } + + // Delete all extras to trigger their destructors + for (ggml_tensor_extra_cl * e : temp_tensor_extras) { + delete e; + } + for (ggml_tensor_extra_cl * e : temp_tensor_extras_in_use) { + delete e; + } + for (ggml_tensor_extra_cl_q4_0 * e : temp_tensor_extras_q4_0) { + delete e; + } + for (ggml_tensor_extra_cl_q4_0 * e : temp_tensor_extras_q4_0_in_use) { + delete e; + } + } + + ggml_tensor_extra_cl * ggml_opencl_alloc_temp_tensor_extra() { + ggml_tensor_extra_cl * extra; + if (temp_tensor_extras.empty()) { + extra = new ggml_tensor_extra_cl(); + } else { + extra = temp_tensor_extras.back(); + temp_tensor_extras.pop_back(); + } + + temp_tensor_extras_in_use.push_back(extra); + + extra->reset(); + return extra; + } + + ggml_tensor_extra_cl_q4_0 * ggml_opencl_alloc_temp_tensor_extra_q4_0() { + ggml_tensor_extra_cl_q4_0 * extra; + if (temp_tensor_extras_q4_0.empty()) { + extra = new ggml_tensor_extra_cl_q4_0(); + } else { + extra = temp_tensor_extras_q4_0.back(); + temp_tensor_extras_q4_0.pop_back(); + } + + temp_tensor_extras_q4_0_in_use.push_back(extra); + + extra->reset(); + return extra; + } + + void reset() { + for (ggml_tensor_extra_cl * e : temp_tensor_extras_in_use) { + temp_tensor_extras.push_back(e); + } + temp_tensor_extras_in_use.clear(); + + for (ggml_tensor_extra_cl_q4_0 * e : temp_tensor_extras_q4_0_in_use) { + temp_tensor_extras_q4_0.push_back(e); + } + temp_tensor_extras_q4_0_in_use.clear(); + } + + // Pools for extras. Available extras are in `temp_tensor_extras`. Extras + // being used are in `temp_tensor_extras_in_use`. At the first run, new + // extras get created and put in `in_use`. When the buffer is reset via + // the `reset` callback, all extras in `in_use` get moved to available extras + // for reuse. + std::vector temp_tensor_extras; + std::vector temp_tensor_extras_in_use; + std::vector temp_tensor_extras_q4_0; + std::vector temp_tensor_extras_q4_0_in_use; + + // The buffer_context is initially created by ggml_backend_buft_alloc_buffer + // before any tensor is initialized (at the beginning of alloc_tensor_range). + // Hence, there is alway a buffer object in this vector. When each tensor is + // being initialized, this original buffer object will be released if both + // flattening and small allocation are enabled, and additional buffer + // objects will be created in init_tensor to represent flattened quantized + // weights. + std::vector buffer; + // These are image1d_buffer_t objects that wrap around the quants and scales. + // For Q4_0 quantization, there should be two of them - one for quants and + // one for scales. They should be populated only when flattening and small + // allocation are enabled. + std::vector img; + std::string name; +}; + +static void * const cl_ptr_base = (void *)(uintptr_t) 0x1000; + +static void ggml_backend_opencl_buffer_free_buffer(ggml_backend_buffer_t buffer) { + ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context; + delete ctx; +} + +static void * ggml_backend_opencl_buffer_get_base(ggml_backend_buffer_t buffer) { + return cl_ptr_base; + + GGML_UNUSED(buffer); +} + +static void ggml_backend_opencl_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) { + ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context; + + ggml_cl2_init(buffer->buft->device); + + if (tensor->view_src != nullptr) { + GGML_ASSERT(tensor->view_src->buffer->buft == buffer->buft); + + ggml_tensor_extra_cl * view_extra = (ggml_tensor_extra_cl *) tensor->view_src->extra; + GGML_ASSERT(view_extra && "view_extra is nullptr?"); + + // Reuse extra of the parent tensor. The offset of this view tensor + // becomes `extra->offset + view_offs` and needs to be calculated when + // it is used. This changes is needed because of the change to + // ggml_alloc.c in https://github.com/ggerganov/llama.cpp/pull/7640. + // `buffer` passed in here will always be `tensor->buffer`. It is OK + // to allocate extras from the same buffer context for ordinary + // intermediate tensors. But for views into kv cache tensors, doing so + // would mess up the extras used by kv cache. + // Before #7640, `buffer` is for intermediate tensors, which is always + // different from that of kv cache tensors. + // + // NB: now extra->offset no longer accounts for view_offs. + // NB: this should not apply to weight tensors (for end-to-end runs, but + // may apply for test-backend-ops). + // FIXME: if any unexpected results are seen, double check the offset - + // there could be other places that need fix. + tensor->extra = view_extra; + } else { + { + size_t offset = (char *)tensor->data - (char *)cl_ptr_base; + + ggml_tensor_extra_cl * extra = ctx->ggml_opencl_alloc_temp_tensor_extra(); + extra->offset = offset; + extra->data_device = ctx->buffer[0]; + extra->actual_size = ggml_nbytes(tensor); + + tensor->extra = extra; + } + } +} + +// The optimized gemm and gemv kernels are used for large matrices without batch. +// tensor is the quantized weights matrix. +inline bool use_adreno_kernels(const ggml_tensor *tensor) { + return tensor->ne[0] >= 512 && tensor->ne[1] >= 512 && + tensor->ne[2] == 1 && tensor->ne[3] == 1; +} + +static void ggml_backend_opencl_buffer_set_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + ggml_backend_opencl_context *backend_ctx = ggml_cl2_init(buffer->buft->device); + + cl_context context = backend_ctx->context; + cl_command_queue queue = backend_ctx->queue; + +#ifdef GGML_OPENCL_SOA_Q + // We separate the quantized bits and scale from block_q4_0 by using an + // additional kernel, where each thread handles a block. We first read the + // original weights into a temporary buffer, then create two separate + // buffers for quantized bits and scales, which are then populated by the + // conversion kernel. + if (tensor->type == GGML_TYPE_Q4_0) { + // Tensors should have been preallocated, therefore they should + // already have ggml_tensor_extra_cl as extra. + ggml_tensor_extra_cl * extra_orig = (ggml_tensor_extra_cl *)tensor->extra; + GGML_ASSERT(extra_orig && "Tesnors in OpenCL backend should have been allocated and initialized"); + + // Allocate the new extra and create aliases from the original. + ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context; + ggml_tensor_extra_cl_q4_0 * extra = ctx->ggml_opencl_alloc_temp_tensor_extra_q4_0(); + + size_t size_d = ggml_nelements(tensor)/ggml_blck_size(tensor->type)*sizeof(ggml_fp16_t); + size_t size_q = ggml_nelements(tensor)/ggml_blck_size(tensor->type)*ggml_blck_size(tensor->type)/2; + GGML_ASSERT(size_d + size_q == ggml_nbytes(tensor) && "Incorrect tensor size"); + + cl_int err; + cl_mem data_device = clCreateBuffer(context, CL_MEM_READ_WRITE, + ggml_nbytes(tensor), NULL, &err); + CL_CHECK(err); + CL_CHECK(clEnqueueWriteBuffer( + queue, data_device, CL_TRUE, 0, + ggml_nbytes(tensor), data, 0, NULL, NULL)); + + // We consider the specified offset arg as always, although For weights + // the offset arg should be 0 (we do not assert this). + //GGML_ASSERT(offset == 0); + + // We create subbuffers from the original tensor buffer for scales and + // quants - i.e., scales and quants are aliases into the buffer obejct + // that backs the original tensor. This is a cleaner way to adapt to the + // new memory management. + // In the old code, we allocate new buffers for scales and quants + // respectively, which could still be done but would result in double + // allocation; properly deallocating the preallocated buffer that backs + // the tensors is tricky and would leak the backend specific information + // into the general backend code. + // Does this create misaligned subbuffers (alignment is 1024) in certain + // cases ? + cl_buffer_region region; + + // The original tensor memory is divided into scales and quants, i.e., + // we first store scales, then quants. + // Create subbuffer for scales. + region.origin = extra_orig->offset + tensor->view_offs + offset; + region.size = size_d; + extra->d = clCreateSubBuffer( + extra_orig->data_device, CL_MEM_READ_WRITE, + CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err); + CL_CHECK(err); + + // Create subbuffer for quants. + region.origin = extra_orig->offset + tensor->view_offs + offset + size_d; + region.size = size_q; + extra->q = clCreateSubBuffer( + extra_orig->data_device, CL_MEM_READ_WRITE, + CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err); + CL_CHECK(err); + + //cl_kernel kernel = backend_ctx->kernel_convert_block_q4_0; + #ifdef GGML_OPENCL_USE_ADRENO_KERNELS + cl_kernel kernel = backend_ctx->kernel_convert_block_q4_0; + + // The optimized kernels need weights in natural order, so unshuffle. + if (use_adreno_kernels(tensor)) { + kernel = backend_ctx->kernel_convert_block_q4_0_noshuffle; + } + #else + cl_kernel kernel = backend_ctx->kernel_convert_block_q4_0; + #endif // GGML_OPENCL_USE_ADRENO_KERNELS + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &extra->q)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra->d)); + + size_t global_work_size[] = {(size_t)ggml_nelements(tensor)/ggml_blck_size(tensor->type), 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + CL_CHECK(clReleaseMemObject(data_device)); + + tensor->extra = extra; + + // transpose the weights and scales + #ifdef GGML_OPENCL_USE_ADRENO_KERNELS + // Only do transpose for large, non batched matrix + // TODO: use preallocated images instead of sub-buffer then image + if (use_adreno_kernels(tensor)) { + // <----------------------------------------------------------------------------------> // + // start transpose + // <----------------------------------------------------------------------------------> // + int M = tensor->ne[1]; // ne01 + int K = tensor->ne[0]; // ne00 + + // transpose is out of place, so we need to allocate transposed buffers + // <----------------------------------------------------------------------------------> // + // use sub_buffer of max buffer size instead + + size_t q_size_bytes = K * M / 8 * sizeof(float); + cl_buffer_region region; + region.origin = 0; + region.size = q_size_bytes; + cl_mem qT_d = clCreateSubBuffer( + backend_ctx->A_q_d_max, + 0, + CL_BUFFER_CREATE_TYPE_REGION, + ®ion, + &err); + // cl_mem qT_d = clCreateBuffer(context, CL_MEM_READ_WRITE, q_size_bytes, NULL, &err); + CL_CHECK(err); + + // size_t d_size_bytes = M * (K / 32) / 2 * sizeof(float); + size_t d_size_bytes = M * (K / 32) * 2; + region.origin = 0; + region.size = d_size_bytes; + cl_mem dT_d = clCreateSubBuffer( + backend_ctx->A_s_d_max, + 0, + CL_BUFFER_CREATE_TYPE_REGION, + ®ion, + &err); + // cl_mem dT_d = clCreateBuffer(context, CL_MEM_READ_WRITE, d_size_bytes, NULL, &err); + CL_CHECK(err); + + // <----------------------------------------------------------------------------------> // + + + // create images from the buffers + // <----------------------------------------------------------------------------------> // + cl_mem q_d_image1D; + cl_mem d_d_image1D; + cl_mem qT_d_image1D; + cl_mem dT_d_image1D; + + cl_image_format img_fmt_1d = { CL_RGBA, CL_FLOAT }; + cl_image_desc img_desc_1d; + + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.image_width = M * K / 8 / 4; + img_desc_1d.buffer = extra->q; + q_d_image1D = clCreateImage(context, 0, &img_fmt_1d, &img_desc_1d, NULL, &err); + CL_CHECK(err); + + img_fmt_1d = { CL_RGBA, CL_FLOAT }; + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.image_width = M * K / 8 / 4; + img_desc_1d.buffer = qT_d; + qT_d_image1D = clCreateImage(context, 0, &img_fmt_1d, &img_desc_1d, NULL, &err); + CL_CHECK(err); + + img_fmt_1d = { CL_RGBA, CL_FLOAT }; + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.image_width = M * K / 32 / 4 / 2; + img_desc_1d.buffer = extra->d; + d_d_image1D = clCreateImage(context, 0, &img_fmt_1d, &img_desc_1d, NULL, &err); + CL_CHECK(err); + + img_fmt_1d = { CL_RGBA, CL_FLOAT }; + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.image_width = M * K / 32 / 4 / 2; + img_desc_1d.buffer = dT_d; + dT_d_image1D = clCreateImage(context, 0, &img_fmt_1d, &img_desc_1d, NULL, &err); + CL_CHECK(err); + // <----------------------------------------------------------------------------------> // + + // set up and call the transpose kernels + // <----------------------------------------------------------------------------------> // + // weights + int height_q = M / 8; + int width_q = K / 8 / 4; + kernel = backend_ctx->kernel_transpose_16; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &q_d_image1D)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &qT_d_image1D)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), &height_q)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), &width_q)); + + size_t local_size_q[3] = {4, 16, 1}; + size_t global_size_q[3] = {static_cast(width_q), static_cast(height_q), 1}; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_size_q, local_size_q, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + + // scales + int height_s = M / 8; + int width_s = K / 32 / 8; + + kernel = backend_ctx->kernel_transpose_16; + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_d_image1D)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &dT_d_image1D)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), &height_s)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), &width_s)); + + size_t local_size_s[3] = {4, 16, 1}; + size_t global_size_s[3] = {static_cast(width_s), static_cast(height_s), 1}; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_size_s, local_size_s, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + // <----------------------------------------------------------------------------------> // + + // copy transposed buffer contents to original buffers + // <----------------------------------------------------------------------------------> // + // weights + CL_CHECK(clEnqueueCopyBuffer(queue, qT_d, extra->q, 0, 0, q_size_bytes, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + + // scales + CL_CHECK(clEnqueueCopyBuffer(queue, dT_d, extra->d, 0, 0, d_size_bytes, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + // <----------------------------------------------------------------------------------> // + + // deallocate transpose buffers + // <----------------------------------------------------------------------------------> // + CL_CHECK(clReleaseMemObject(qT_d)); + CL_CHECK(clReleaseMemObject(dT_d)); + + // deallocate temporary images + CL_CHECK(clReleaseMemObject(q_d_image1D)); + CL_CHECK(clReleaseMemObject(d_d_image1D)); + CL_CHECK(clReleaseMemObject(qT_d_image1D)); + CL_CHECK(clReleaseMemObject(dT_d_image1D)); + // <----------------------------------------------------------------------------------> // + // end transpose + // <----------------------------------------------------------------------------------> // + } + #endif // GGML_OPENCL_USE_ADRENO_KERNELS + + return; + } +#endif // GGML_OPENCL_SOA_Q + + ggml_tensor_extra_cl * extra = (ggml_tensor_extra_cl *) tensor->extra; + GGML_ASSERT(extra); + + CL_CHECK(clEnqueueWriteBuffer( + queue, extra->data_device, CL_TRUE, extra->offset + offset, + size, data, 0, NULL, NULL)); + + GGML_UNUSED(buffer); +} + +static void ggml_backend_opencl_buffer_get_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * tensor, void * data, size_t offset, size_t size) { + GGML_ASSERT(tensor->extra); + + ggml_backend_opencl_context *backend_ctx = ggml_cl2_init(buffer->buft->device); + + cl_context context = backend_ctx->context; + cl_command_queue queue = backend_ctx->queue; + + // Make sure all previously submitted commands are finished. + CL_CHECK(clFinish(queue)); + +#ifdef GGML_OPENCL_SOA_Q + // In end-to-end runs, get_tensor is usually used to get back the logits, + // where we can simply do clEnqueueReadBuffer since they are f32. + // However, in test-backend-ops, the GPU graph is copied to the CPU backend, + // which requires reading back quantized weight tensors. + // To properly support this, we need to restore block_q4_0 struct arrays + // from the flattened buffers. + if (tensor->type == GGML_TYPE_Q4_0) { + ggml_tensor_extra_cl_q4_0 * extra = (ggml_tensor_extra_cl_q4_0 *)tensor->extra; + + cl_int err; + cl_mem data_device = clCreateBuffer(context, CL_MEM_READ_WRITE, + ggml_nbytes(tensor), NULL, &err); + CL_CHECK(err); + + cl_kernel kernel = backend_ctx->kernel_restore_block_q4_0; + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra->q)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &extra->d)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &data_device)); + + size_t global_work_size[] = {(size_t)ggml_nelements(tensor)/ggml_blck_size(tensor->type), 1, 1}; + size_t local_work_size[] = {1, 1, 1}; + + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, + global_work_size, local_work_size, 0, NULL, &evt)); + CL_CHECK(clWaitForEvents(1, &evt)); + CL_CHECK(clEnqueueReadBuffer( + queue, data_device, CL_TRUE, offset, + size, data, 0, NULL, NULL)); + CL_CHECK(clReleaseMemObject(data_device)); + return; + } +#endif // GGML_OPENCL_SOA_Q + + ggml_tensor_extra_cl * extra = (ggml_tensor_extra_cl *) tensor->extra; + + CL_CHECK(clEnqueueReadBuffer( + queue, extra->data_device, CL_TRUE, extra->offset + tensor->view_offs + offset, + size, data, 0, NULL, NULL)); + + GGML_UNUSED(buffer); +} + +static void ggml_backend_opencl_buffer_clear(ggml_backend_buffer_t buffer, uint8_t value) { + ggml_backend_dev_t dev = buffer->buft->device; + ggml_backend_opencl_context *backend_ctx = ggml_cl2_init(dev); + cl_command_queue queue = backend_ctx->queue; + + ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context; + for (cl_mem buf : ctx->buffer) { + CL_CHECK(clEnqueueFillBuffer(queue, buf, &value, sizeof(value), 0, buffer->size, 0, NULL, NULL)); + } + CL_CHECK(clFinish(queue)); +} + +static void ggml_backend_opencl_buffer_reset(ggml_backend_buffer_t buffer) { + ggml_backend_opencl_buffer_context * ctx = (ggml_backend_opencl_buffer_context *) buffer->context; + ctx->reset(); +} + +static ggml_backend_buffer_i ggml_backend_opencl_buffer_interface = { + /* .free_buffer = */ ggml_backend_opencl_buffer_free_buffer, + /* .get_base = */ ggml_backend_opencl_buffer_get_base, + /* .init_tensor = */ ggml_backend_opencl_buffer_init_tensor, + /* .memset_tensor = */ NULL, + /* .set_tensor = */ ggml_backend_opencl_buffer_set_tensor, + /* .get_tensor = */ ggml_backend_opencl_buffer_get_tensor, + /* .cpy_tensor = */ NULL, + /* .clear = */ ggml_backend_opencl_buffer_clear, + /* .reset = */ ggml_backend_opencl_buffer_reset, +}; + +// +// buffer type +// + +static const char * ggml_backend_opencl_buffer_type_get_name(ggml_backend_buffer_type_t buffer_type) { + return "OpenCL"; + + GGML_UNUSED(buffer_type); +} + +static ggml_backend_buffer_t ggml_backend_opencl_buffer_type_alloc_buffer(ggml_backend_buffer_type_t buffer_type, size_t size) { + ggml_backend_opencl_context *backend_ctx = ggml_cl2_init(buffer_type->device); + + // clCreateBuffer returns -61 for size 0 + size = std::max(size, (size_t)1); + + cl_int err; + cl_mem mem = clCreateBuffer(backend_ctx->context, CL_MEM_READ_WRITE, size, NULL, &err); + if (err != CL_SUCCESS) { + GGML_LOG_INFO("%s: failed to allocate %.2f MiB\n", __func__, size / 1024.0 / 1024.0); + return nullptr; + } + + ggml_backend_opencl_buffer_context * ctx = new ggml_backend_opencl_buffer_context(mem); + + return ggml_backend_buffer_init(buffer_type, ggml_backend_opencl_buffer_interface, ctx, size); +} + +static size_t ggml_backend_opencl_buffer_type_get_alignment(ggml_backend_buffer_type_t buffer_type) { + // FIXME: not thread safe, device may not be initialized yet + static cl_uint alignment = -1; + if (alignment == (cl_uint)-1) { + ggml_backend_opencl_context * backend_ctx = ggml_cl2_init(buffer_type->device); + alignment = backend_ctx->alignment; + } + return alignment; +} + +static size_t ggml_backend_opencl_buffer_type_get_max_size(ggml_backend_buffer_type_t buffer_type) { + static size_t max_size = -1; + if (max_size == (size_t)-1) { + ggml_backend_opencl_context * backend_ctx = ggml_cl2_init(buffer_type->device); + max_size = backend_ctx->max_alloc_size; + } + return max_size; +} + +static bool ggml_backend_opencl_buffer_type_supports_backend(ggml_backend_buffer_type_t buft, ggml_backend_t backend) { + return ggml_backend_is_opencl(backend); + + UNUSED(buft); +} + +static ggml_backend_buffer_type_i ggml_backend_opencl_buffer_type_interface = { + /* .get_name = */ ggml_backend_opencl_buffer_type_get_name, + /* .alloc_buffer = */ ggml_backend_opencl_buffer_type_alloc_buffer, + /* .get_alignment = */ ggml_backend_opencl_buffer_type_get_alignment, + /* .get_max_size = */ ggml_backend_opencl_buffer_type_get_max_size, + /* .get_alloc_size = */ NULL, + /* .is_host = */ NULL, +}; + +ggml_backend_buffer_type_t ggml_backend_opencl_buffer_type() { + static ggml_backend_buffer_type buffer_type = { + /* .iface = */ ggml_backend_opencl_buffer_type_interface, + /* .device = */ &g_ggml_backend_opencl_device, + /* .context = */ nullptr, + }; + + return &buffer_type; +} + +// +// backend device +// + +static const char * ggml_backend_opencl_device_get_name(ggml_backend_dev_t dev) { + return "GPUOpenCL"; + + GGML_UNUSED(dev); +} + +static const char * ggml_backend_opencl_device_get_description(ggml_backend_dev_t dev) { + ggml_backend_opencl_device_context *dev_ctx = (ggml_backend_opencl_device_context *) dev->context; + return dev_ctx->device_name.c_str(); +} + +static void ggml_backend_opencl_device_get_memory(ggml_backend_dev_t dev, size_t * free, size_t * total) { + *free = 1; + *total = 1; + + GGML_UNUSED(dev); +} + +static enum ggml_backend_dev_type ggml_backend_opencl_device_get_type(ggml_backend_dev_t dev) { + return GGML_BACKEND_DEVICE_TYPE_GPU; + + GGML_UNUSED(dev); +} + +static void ggml_backend_opencl_device_get_props(ggml_backend_dev_t dev, struct ggml_backend_dev_props * props) { + props->name = ggml_backend_opencl_device_get_name(dev); + props->description = ggml_backend_opencl_device_get_description(dev); + props->type = ggml_backend_opencl_device_get_type(dev); + ggml_backend_opencl_device_get_memory(dev, &props->memory_free, &props->memory_total); + props->caps = ggml_backend_dev_caps { + /* .async = */ false, + /* .host_buffer = */ false, + /* .buffer_from_host_ptr = */ false, + /* .events = */ false, + }; +} + +static ggml_backend_t ggml_backend_opencl_device_init(ggml_backend_dev_t dev, const char * params) { + ggml_backend_opencl_context * backend_ctx = ggml_cl2_init(dev); + + ggml_backend_t backend = new ggml_backend { + /* .guid = */ ggml_backend_opencl_guid(), + /* .interface = */ ggml_backend_opencl_i, + /* .device = */ dev, + /* .context = */ backend_ctx, + }; + + return backend; + + GGML_UNUSED(params); +} + +static ggml_backend_buffer_type_t ggml_backend_opencl_device_get_buffer_type(ggml_backend_dev_t dev) { + return ggml_backend_opencl_buffer_type(); + + GGML_UNUSED(dev); +} + +static ggml_backend_buffer_t ggml_backend_opencl_device_buffer_from_ptr(ggml_backend_dev_t dev, void * ptr, size_t size, size_t max_tensor_size) { + GGML_UNUSED(dev); + GGML_UNUSED(ptr); + GGML_UNUSED(size); + GGML_UNUSED(max_tensor_size); + return nullptr; +} + +static bool ggml_backend_opencl_device_supports_op(ggml_backend_dev_t dev, const struct ggml_tensor * op) { + return ggml_opencl_supports_op(dev, op); +} + +static bool ggml_backend_opencl_device_supports_buft(ggml_backend_dev_t dev, ggml_backend_buffer_type_t buft) { + return buft->iface.get_name == ggml_backend_opencl_buffer_type_get_name; + + GGML_UNUSED(dev); +} + +static struct ggml_backend_device_i ggml_backend_opencl_device_i = { + /* .get_name = */ ggml_backend_opencl_device_get_name, + /* .get_description = */ ggml_backend_opencl_device_get_description, + /* .get_memory = */ ggml_backend_opencl_device_get_memory, + /* .get_type = */ ggml_backend_opencl_device_get_type, + /* .get_props = */ ggml_backend_opencl_device_get_props, + /* .init_backend = */ ggml_backend_opencl_device_init, + /* .get_buffer_type = */ ggml_backend_opencl_device_get_buffer_type, + /* .get_host_buffer_type = */ NULL, + /* .buffer_from_host_ptr = */ ggml_backend_opencl_device_buffer_from_ptr, + /* .supports_op = */ ggml_backend_opencl_device_supports_op, + /* .supports_buft = */ ggml_backend_opencl_device_supports_buft, + /* .offload_op = */ NULL, + /* .event_new = */ NULL, + /* .event_free = */ NULL, + /* .event_synchronize = */ NULL, +}; + +// Backend registry + +static const char * ggml_backend_opencl_reg_get_name(ggml_backend_reg_t reg) { + return "OpenCL"; + + GGML_UNUSED(reg); +} + +static size_t ggml_backend_opencl_reg_device_count(ggml_backend_reg_t reg) { + return ggml_backend_opencl_n_devices; + + GGML_UNUSED(reg); +} + +static ggml_backend_dev_t ggml_backend_opencl_reg_device_get(ggml_backend_reg_t reg, size_t index) { + GGML_ASSERT(index == 0); + + return &g_ggml_backend_opencl_device; + + GGML_UNUSED(reg); + GGML_UNUSED(index); +} + +static struct ggml_backend_reg_i ggml_backend_opencl_reg_i = { + /* .get_name = */ ggml_backend_opencl_reg_get_name, + /* .device_count = */ ggml_backend_opencl_reg_device_count, + /* .device_get = */ ggml_backend_opencl_reg_device_get, + /* .get_proc_address = */ NULL, +}; + +ggml_backend_reg_t ggml_backend_opencl_reg(void) { + // TODO: make this thread-safe somehow? + static ggml_backend_reg reg; + static bool initialized = false; + + if (!initialized) { + reg = ggml_backend_reg { + /* .api_version = */ GGML_BACKEND_API_VERSION, + /* .iface = */ ggml_backend_opencl_reg_i, + /* .context = */ NULL, + }; + + g_ggml_backend_opencl_device = ggml_backend_device { + /* .iface = */ ggml_backend_opencl_device_i, + /* .reg = */ ®, + /* .context = */ &g_ggml_ctx_dev_main, + }; + + ggml_cl2_init(&g_ggml_backend_opencl_device); + + initialized = true; + } + + return ® +} + +GGML_BACKEND_DL_IMPL(ggml_backend_opencl_reg) + +//------------------------------------------------------------------------------ +// Debugging utils +//------------------------------------------------------------------------------ +#if 0 +#define QK4_0 32 +typedef struct { + ggml_fp16_t d; // delta + uint8_t qs[QK4_0 / 2]; // nibbles / quants +} block_q4_0; +static_assert(sizeof(block_q4_0) == sizeof(ggml_fp16_t) + QK4_0 / 2, + "wrong q4_0 block size/padding"); + +#include +#ifdef __cplusplus +#include "half.hpp" +#endif + +static void dump_tensor(ggml_backend_t backend, const struct ggml_tensor * tensor) { + void * buf = malloc(ggml_nbytes(tensor)); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; +#ifdef GGML_OPENCL_SOA_Q + void * buf_q; + void * buf_d; +#endif + +#ifdef GGML_USE_OPENCL + // Make sure everything is done. + CL_CHECK(clFinish(queue)); + +#ifdef GGML_OPENCL_SOA_Q + if (tensor->type == GGML_TYPE_Q4_0) { + ggml_tensor_extra_cl_q4_0 * extra = (ggml_tensor_extra_cl_q4_0 *) tensor->extra; + GGML_ASSERT(extra); + + size_t size_q = ggml_nelements(tensor)/QK4_0 * QK4_0/2; + size_t size_d = ggml_nelements(tensor)/QK4_0 * sizeof(ggml_fp16_t); + GGML_ASSERT(size_q + size_d == ggml_nbytes(tensor)); + buf_q = malloc(size_q); + buf_d = malloc(size_d); + + CL_CHECK(clEnqueueReadBuffer(queue, extra->q, CL_TRUE, 0, size_q, buf_q, 0, NULL, NULL)); + CL_CHECK(clEnqueueReadBuffer(queue, extra->d, CL_TRUE, 0, size_d, buf_d, 0, NULL, NULL)); + CL_CHECK(clFinish(queue)); + } else { + // Read out the tensor from GPU memory. + ggml_tensor_extra_cl * extra = (ggml_tensor_extra_cl *) tensor->extra; + GGML_ASSERT(extra); + + CL_CHECK(clEnqueueReadBuffer(queue, extra->data_device, CL_TRUE, + extra->offset, ggml_nbytes(tensor), buf, 0, NULL, NULL)); + CL_CHECK(clFinish(queue)); + } +#else + // Read out the tensor from GPU memory. + ggml_tensor_extra_cl * extra = (ggml_tensor_extra_cl *) tensor->extra; + GGML_ASSERT(extra); + + CL_CHECK(clEnqueueReadBuffer(queue, extra->data_device, CL_TRUE, + extra->offset, ggml_nbytes(tensor), buf, 0, NULL, NULL)); + CL_CHECK(clFinish(queue)); +#endif // GGML_OPENCL_SOA_Q +#endif // GGML_USE_OPENCL + + // Open file and dump. + char fname[512]; + sprintf(fname, "./tensor-dumps/%s.txt", tensor->name); + FILE * f = fopen(fname, "w"); + if (!f) { + printf("Failed to open %s\n", fname); + return; + } + + if (tensor->type == GGML_TYPE_F32) { + float * data = (float *) buf; + for (int i = 0; i < ggml_nelements(tensor); ++i) { + if (isnan(data[i])) { + printf("NaN found: %s\n", tensor->name); + break; + } + fprintf(f, "%f\n", data[i]); + } + } else if (tensor->type == GGML_TYPE_I32) { + int * data = (int *) buf; + for (int i = 0; i < ggml_nelements(tensor); ++i) { + if (isnan(data[i])) { + printf("NaN found: %s\n", tensor->name); + break; + } + fprintf(f, "%d\n", data[i]); + } + } else if (tensor->type == GGML_TYPE_F16) { +#ifdef __cplusplus + half_float::half * data = (half_float::half *) buf; + for (int i = 0; i < ggml_nelements(tensor); ++i) { + if (std::isnan(data[i])) { + printf("NaN found: %s\n", tensor->name); + break; + } + fprintf(f, "%f\n", float(data[i])); + } +#endif + } else if (tensor->type == GGML_TYPE_Q4_0) { +#ifdef GGML_OPENCL_SOA_Q + ggml_fp16_t * data_d = (ggml_fp16_t *)buf_d; + unsigned char * data_q = (unsigned char *)buf_q; + + for (int i = 0; i < ggml_nelements(tensor)/QK4_0; ++i) { + fprintf(f, "%04x, ", data_d[i]); + for (int k = 0; k < QK4_0/2; ++k) { + fprintf(f, "%02x, ", data_q[k]); + } + fprintf(f, "\n"); + data_q += QK4_0/2; + } + free(buf_d); + free(buf_q); +#else + block_q4_0 * data = (block_q4_0 *) buf; + for (int i = 0; i < ggml_nelements(tensor)/QK4_0; ++i) { + fprintf(f, "%04x, ", data[i].d); + for (int k = 0; k < QK4_0/2; ++k) { + fprintf(f, "%02x, ", data[i].qs[k]); + } + fprintf(f, "\n"); + } +#endif // GGML_OPENCL_SOA_Q + } + free(buf); + fflush(f); + fclose(f); +} +#else +#define dump_tensor(tensor) +#endif + +//------------------------------------------------------------------------------ +// Profiling utility +//------------------------------------------------------------------------------ +#ifdef GGML_OPENCL_PROFILING +void populateProfilingInfo( + ProfilingInfo& info, cl_event evt, cl_kernel kernel, + size_t global_size[3], size_t local_size[3], + const ggml_tensor * tensor) { + cl_ulong start; + cl_ulong end; + CL_CHECK(clWaitForEvents(1, &evt)); + CL_CHECK(clGetEventProfilingInfo( + evt, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, NULL)); + CL_CHECK(clGetEventProfilingInfo( + evt, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL)); + + char kernel_name[512]; + CL_CHECK(clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, + sizeof(kernel_name), kernel_name, NULL)); + + info.duration_ns = end - start; + info.op_name = tensor->name; + info.kernel_name = kernel_name; + info.local_size[0] = local_size[0]; + info.local_size[1] = local_size[1]; + info.local_size[2] = local_size[2]; + info.global_size[0] = global_size[0]; + info.global_size[1] = global_size[1]; + info.global_size[2] = global_size[2]; + info.output_size[0] = tensor->ne[0]; + info.output_size[1] = tensor->ne[1]; + info.output_size[2] = tensor->ne[2]; + info.output_size[3] = tensor->ne[3]; +} +#endif + +//------------------------------------------------------------------------------ +// Ops +//------------------------------------------------------------------------------ + +static bool ggml_cl_can_mul_mat(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst) { + const int64_t ne10 = src1->ne[0]; + + const int64_t ne0 = dst->ne[0]; + const int64_t ne1 = dst->ne[1]; + + // TODO: find the optimal values for these + return (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && + src1->type == GGML_TYPE_F32 && + dst->type == GGML_TYPE_F32 && + (ne0 >= 32 && ne1 >= 32 && ne10 >= 32); +} + +static void ggml_cl_nop(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + UNUSED(backend); + UNUSED(src0); + UNUSED(src1); + UNUSED(dst); +} + +static void ggml_cl_get_rows(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + const int ne00 = src0 ? src0->ne[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + const cl_ulong nb02 = src0 ? src0->nb[2] : 0; + const int ne10 = src1 ? src1->ne[0] : 0; + const cl_ulong nb10 = src1 ? src1->nb[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; + const cl_ulong nb11 = src1 ? src1->nb[1] : 0; + const cl_ulong nb1 = dst ? dst->nb[1] : 0; + const cl_ulong nb2 = dst ? dst->nb[2] : 0; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel; + + switch (src0->type) { + case GGML_TYPE_F32: + kernel = backend_ctx->kernel_get_rows_f32; + break; + case GGML_TYPE_F16: + kernel = backend_ctx->kernel_get_rows_f16; + break; + case GGML_TYPE_Q4_0: + kernel = backend_ctx->kernel_get_rows_q4_0; + break; + default: + GGML_ASSERT(false && "not implemented"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong), &nb2)); + + size_t global_work_size[] = {(size_t)ne10, (size_t)ne11, 1}; + size_t local_work_size[] = {1, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_add(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + const cl_ulong nb00 = src0 ? src0->nb[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + const cl_ulong nb02 = src0 ? src0->nb[2] : 0; + const cl_ulong nb03 = src0 ? src0->nb[3] : 0; + + const int ne10 = src1 ? src1->ne[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; + const int ne12 = src1 ? src1->ne[2] : 0; + const int ne13 = src1 ? src1->ne[3] : 0; UNUSED(ne13); + + const cl_ulong nb10 = src1 ? src1->nb[0] : 0; + const cl_ulong nb11 = src1 ? src1->nb[1] : 0; + const cl_ulong nb12 = src1 ? src1->nb[2] : 0; + const cl_ulong nb13 = src1 ? src1->nb[3] : 0; UNUSED(nb13); + + const int ne0 = dst ? dst->ne[0] : 0; + const int ne1 = dst ? dst->ne[1] : 0; + const int ne2 = dst ? dst->ne[2] : 0; + const int ne3 = dst ? dst->ne[3] : 0; + + const cl_ulong nb0 = dst ? dst->nb[0] : 0; + const cl_ulong nb1 = dst ? dst->nb[1] : 0; + const cl_ulong nb2 = dst ? dst->nb[2] : 0; + const cl_ulong nb3 = dst ? dst->nb[3] : 0; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + bool bcast_row = false; + cl_kernel kernel; + + if (ggml_nelements(src1) == ne10 && ggml_is_contiguous(src1) && ne00 % 4 == 0 && ne10 % 4 == 0) { + GGML_ASSERT(ggml_is_contiguous(src0)); + + // src1 is a row + GGML_ASSERT(ne11 == 1); + + bcast_row = true; + int ne = ne00 / 4; + kernel = backend_ctx->kernel_add_row; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne)); + } else { + kernel = backend_ctx->kernel_add; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne03)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne11)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(int), &ne13)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 20, sizeof(cl_ulong), &nb12)); + CL_CHECK(clSetKernelArg(kernel, 21, sizeof(cl_ulong), &nb13)); + CL_CHECK(clSetKernelArg(kernel, 22, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 23, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 24, sizeof(int), &ne2)); + CL_CHECK(clSetKernelArg(kernel, 25, sizeof(int), &ne3)); + CL_CHECK(clSetKernelArg(kernel, 26, sizeof(cl_ulong), &nb0)); + CL_CHECK(clSetKernelArg(kernel, 27, sizeof(cl_ulong), &nb1)); + CL_CHECK(clSetKernelArg(kernel, 28, sizeof(cl_ulong), &nb2)); + CL_CHECK(clSetKernelArg(kernel, 29, sizeof(cl_ulong), &nb3)); + } + + if (bcast_row) { + int n = ggml_nelements(dst)/4; + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } else { + unsigned int nth = MIN(64, ne0); + size_t global_work_size[] = {ne01*nth, (size_t)ne02, (size_t)ne03}; + size_t local_work_size[] = {nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } +} + +static void ggml_cl_mul(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + const cl_ulong nb00 = src0 ? src0->nb[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + const cl_ulong nb02 = src0 ? src0->nb[2] : 0; + const cl_ulong nb03 = src0 ? src0->nb[3] : 0; + + const int ne10 = src1 ? src1->ne[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; + const int ne12 = src1 ? src1->ne[2] : 0; + const int ne13 = src1 ? src1->ne[3] : 0; UNUSED(ne13); + + const cl_ulong nb10 = src1 ? src1->nb[0] : 0; + const cl_ulong nb11 = src1 ? src1->nb[1] : 0; + const cl_ulong nb12 = src1 ? src1->nb[2] : 0; + const cl_ulong nb13 = src1 ? src1->nb[3] : 0; UNUSED(nb13); + + const int ne0 = dst ? dst->ne[0] : 0; + const int ne1 = dst ? dst->ne[1] : 0; + const int ne2 = dst ? dst->ne[2] : 0; + const int ne3 = dst ? dst->ne[3] : 0; + + const cl_ulong nb0 = dst ? dst->nb[0] : 0; + const cl_ulong nb1 = dst ? dst->nb[1] : 0; + const cl_ulong nb2 = dst ? dst->nb[2] : 0; + const cl_ulong nb3 = dst ? dst->nb[3] : 0; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + bool bcast_row = false; + cl_kernel kernel; + + if (ggml_nelements(src1) == ne10 && ggml_is_contiguous(src1) && ne00 % 4 == 0 && ne10 % 4 == 0) { + GGML_ASSERT(ggml_is_contiguous(src0)); + + // src1 is a row + GGML_ASSERT(ne11 == 1); + + bcast_row = true; + int ne = ne00 / 4; + kernel = backend_ctx->kernel_mul_row; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne)); + } else { + kernel = backend_ctx->kernel_mul; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne03)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne11)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(int), &ne13)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 20, sizeof(cl_ulong), &nb12)); + CL_CHECK(clSetKernelArg(kernel, 21, sizeof(cl_ulong), &nb13)); + CL_CHECK(clSetKernelArg(kernel, 22, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 23, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 24, sizeof(int), &ne2)); + CL_CHECK(clSetKernelArg(kernel, 25, sizeof(int), &ne3)); + CL_CHECK(clSetKernelArg(kernel, 26, sizeof(cl_ulong), &nb0)); + CL_CHECK(clSetKernelArg(kernel, 27, sizeof(cl_ulong), &nb1)); + CL_CHECK(clSetKernelArg(kernel, 28, sizeof(cl_ulong), &nb2)); + CL_CHECK(clSetKernelArg(kernel, 29, sizeof(cl_ulong), &nb3)); + } + + if (bcast_row) { + int n = ggml_nelements(dst)/4; + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } else { + unsigned int nth = MIN(64, ne0); + size_t global_work_size[] = {ne01*nth, (size_t)ne02, (size_t)ne03}; + size_t local_work_size[] = {nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } +} + +static void ggml_cl_gelu(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel; + + int n = ggml_nelements(dst); + + if (n % 4 == 0) { + kernel = backend_ctx->kernel_gelu_4; + n /= 4; + } else { + kernel = backend_ctx->kernel_gelu; + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL); +#endif +} + +static void ggml_cl_silu(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel; + + int n = ggml_nelements(dst); + + if (n % 4 == 0) { + kernel = backend_ctx->kernel_silu_4; + n /= 4; + } else { + kernel = backend_ctx->kernel_silu; + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_relu(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel = backend_ctx->kernel_relu; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + + const int64_t n = ggml_nelements(dst); + + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_clamp(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + float min; + float max; + memcpy(&min, ((int32_t *) dst->op_params) + 0, sizeof(float)); + memcpy(&max, ((int32_t *) dst->op_params) + 1, sizeof(float)); + + cl_kernel kernel = backend_ctx->kernel_clamp; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(float), &min)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(float), &max)); + + const int64_t n = ggml_nelements(dst); + + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_norm(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + float eps; + memcpy(&eps, dst->op_params, sizeof(float)); + + const int ne00 = src0 ? src0->ne[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + + GGML_ASSERT(ggml_is_contiguous_1(src0)); + + const int nth = MIN(64, ne00); + + cl_kernel kernel = backend_ctx->kernel_norm; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(float), &eps)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(float)*nth, NULL)); + + const int64_t nrows = ggml_nrows(src0); + + size_t global_work_size[] = {(size_t)nrows*nth, 1, 1}; + size_t local_work_size[] = {(size_t)nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_rms_norm(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_backend_opencl_device_context * dev_ctx = + (ggml_backend_opencl_device_context *)backend->device->context; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + float eps; + memcpy(&eps, dst->op_params, sizeof(float)); + + const int ne00 = src0 ? src0->ne[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + + GGML_ASSERT(ne00 % 4 == 0); + GGML_ASSERT(ggml_is_contiguous_1(src0)); + + const int nth = MIN(64, ne00); + + const int64_t nrows = ggml_nrows(src0); + + size_t global_work_size[] = {(size_t)nrows*nth, 1, 1}; + size_t local_work_size[] = {(size_t)nth, 1, 1}; + + cl_kernel kernel = backend_ctx->kernel_rms_norm; + + // Note, this kernel declares local memory in kernel args and the size + // depends on subgroup size. + // Retrieve subgroup size. + // Note, this requires OpenCL 2.1 and above + size_t sgs; + CL_CHECK(clGetKernelSubGroupInfo(kernel, dev_ctx->device, + CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE, + sizeof(local_work_size), local_work_size, + sizeof(size_t), &sgs, NULL)); + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(float), &eps)); + // This is local memory - the size depends on subgroup size. + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(float)*nth/sgs, NULL)); + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_mul_mat(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + const enum ggml_type src0t = src0 ? src0->type : GGML_TYPE_COUNT; + const enum ggml_type src1t = src1 ? src1->type : GGML_TYPE_COUNT; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + +#ifdef GGML_OPENCL_SOA_Q + ggml_tensor_extra_cl_q4_0 * extra0_q4_0 = (ggml_tensor_extra_cl_q4_0 *)src0->extra; +#endif + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + const cl_ulong nb00 = src0 ? src0->nb[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + const cl_ulong nb02 = src0 ? src0->nb[2] : 0; + const cl_ulong nb03 = src0 ? src0->nb[3] : 0; + + const int ne10 = src1 ? src1->ne[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; + const int ne12 = src1 ? src1->ne[2] : 0; + const int ne13 = src1 ? src1->ne[3] : 0; + + const cl_ulong nb10 = src1 ? src1->nb[0] : 0; + const cl_ulong nb11 = src1 ? src1->nb[1] : 0; + const cl_ulong nb12 = src1 ? src1->nb[2] : 0; + const cl_ulong nb13 = src1 ? src1->nb[3] : 0; + + const int ne0 = dst ? dst->ne[0] : 0; + const int ne1 = dst ? dst->ne[1] : 0; + + int r2 = ne12/ne02; + int r3 = ne13/ne03; + + GGML_ASSERT(ne00 == ne10); + + int nth0 = 32; + int nth1 = 1; + int nrows = 1; + // The number of values produced by each subgroup + int ndst = 4; + + cl_kernel kernel; + +#ifdef GGML_OPENCL_USE_ADRENO_KERNELS + cl_context context = backend_ctx->context; + + if (ne01 && ne1 && use_adreno_kernels(src0)) { + + // init CL objects + // <--------------------------------------------> // + cl_int status; + cl_image_format img_fmt_1d; + cl_image_desc img_desc_1d; + cl_buffer_region region; + cl_mem A_image1d; + cl_mem B_image1d; + cl_mem B_sub_buffer; + cl_mem C_d; + // for B transpose + cl_mem B_d; + cl_mem B_d_input_image; + // <--------------------------------------------> // + + // define matrix dimensions + // <--------------------------------------------> // + int M = ne01; + int N = ne1; + int K = ne00; + int padding; + // <--------------------------------------------> // + + // q4_0 x fp32 + if(src0t == GGML_TYPE_Q4_0 && src1t == GGML_TYPE_F32) { + // TODO: remove duplicate definitions of image description + format -- move to top + + // create an image for A + // <--------------------------------------------> // + if (N == 1) { + img_fmt_1d = { CL_R, CL_UNSIGNED_INT32}; + } else { + img_fmt_1d = { CL_R, CL_FLOAT}; + } + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.image_width = M * K / 2 / 4; // Divide by 4 for char -> float + img_desc_1d.buffer = extra0_q4_0->q; + A_image1d = clCreateImage( + context, + CL_MEM_READ_ONLY, + &img_fmt_1d, + &img_desc_1d, + NULL, + &status); + CL_CHECK(status); + // <--------------------------------------------> // + + + // create a sub_buffer for B + // <--------------------------------------------> // + region.origin = (extra1->offset); + region.size = K * N * sizeof(float); + B_sub_buffer = clCreateSubBuffer( + extra1->data_device, + 0, + CL_BUFFER_CREATE_TYPE_REGION, + ®ion, + &status); + CL_CHECK(status); + // <--------------------------------------------> // + + // transpose activation for Skyler's gemm + if (N != 1) { + //how many extra elements beyond multiple of 8 + int extra_elements = N % 8; + + //how much padding to add + padding = 0; + if (extra_elements > 0){ + padding = 8 - extra_elements; + } + + // Specify the starting offset (in bytes) + region.origin = 0; + // Specify the size of the sub-buffer (divide by 2 for FP16) + region.size = K * (N + padding) * sizeof(float)/2; + B_d = clCreateSubBuffer( + backend_ctx->B_d_max, + 0, + CL_BUFFER_CREATE_TYPE_REGION, + ®ion, + &status); + CL_CHECK(status); + + cl_image_format image_format_B_d_input = { CL_RGBA, CL_FLOAT }; + cl_image_desc image_desc_B_d_input = { + CL_MEM_OBJECT_IMAGE1D_BUFFER, + static_cast(K * N / 4), + 0, 0, 0, 0, 0, 0, 0, { B_sub_buffer } + }; + B_d_input_image = clCreateImage( + context, + 0, + &image_format_B_d_input, + &image_desc_B_d_input, + NULL, + &status); + CL_CHECK(status); + + cl_image_format image_format_B_d_output = { CL_RGBA, CL_HALF_FLOAT }; //(CL_HALF_FLOAT for FP16) + cl_image_desc image_desc_B_d_output = { + CL_MEM_OBJECT_IMAGE1D_BUFFER, + static_cast(K * (N + padding)/4), + 0, 0, 0, 0, 0, 0, 0, { B_d } + }; + B_image1d = clCreateImage( + context, + 0, + &image_format_B_d_output, + &image_desc_B_d_output, + NULL, + &status); + CL_CHECK(status); + + int height_B = N/4; + int width_B = K/4; + int padded_height_B = (N + padding)/4; + + kernel = backend_ctx->kernel_transpose_32_16; + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &B_d_input_image)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &B_image1d)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(int), &height_B)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(int), &width_B)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &padded_height_B)); + + size_t local_size_t[2] = { 1, 16 }; + //WGS tuning + if (ne0 == 4096 && ne1 == 128 && ne10 == 4096) { + local_size_t[0]=4; + local_size_t[1]=8; + } else if (ne0 == 11008 && ne1 == 128 && ne10 == 4096) { + local_size_t[0]=2; + local_size_t[1]=8; + } else if(ne0 == 4096 && ne1 == 128 && ne10 == 11008) { + local_size_t[0]=1; + local_size_t[1]=8; + } else if(ne0 == 32000 && ne1 == 128 && ne10 == 4096) { + local_size_t[0]=2; + local_size_t[1]=8; + } + + size_t global_size_t[2] = { + static_cast(width_B), + static_cast(padded_height_B) + }; + + #ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_size_t, local_size_t, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_size_t, local_size_t, dst); + #else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_size_t, local_size_t, 0, NULL, NULL)); + #endif + } else { + // no need to transpose B in other cases + // create an image for B from sub_buffer + // <--------------------------------------------> // + img_fmt_1d = {CL_RGBA, CL_FLOAT}; + + memset(&img_desc_1d, 0, sizeof(img_desc_1d)); + img_desc_1d.image_width = K * N / 4; + img_desc_1d.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; + img_desc_1d.buffer = B_sub_buffer; + B_image1d = clCreateImage( + context, + CL_MEM_READ_ONLY, + &img_fmt_1d, + &img_desc_1d, + NULL, + &status); + CL_CHECK(status); + // <--------------------------------------------> // + } + + // choose gemm or gemv kernel + // <--------------------------------------------> // + if (N == 1) { + kernel = backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_general; + if (M == 4096 && K == 4096) { + kernel = backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_4096; + } else if (M == 4096 && K == 11008) { + kernel = backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_4096_1_11008; + } else if (M == 11008 && K == 4096) { + kernel = backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_11008_1_4096; + } else if (M == 32000 && K == 4096) { + kernel = backend_ctx->CL_mul_mat_vec_q4_0_f32_1d_4x_flat_32000_1_4096; + } + } else { + kernel = backend_ctx->CL_mul_mat_Ab_Bi_8x4; + } + // <--------------------------------------------> // + + // set kernel args + // <--------------------------------------------> // + cl_uint k_arg = 0; + + if (N == 1) { + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &A_image1d)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extra0_q4_0->d)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &B_image1d)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_ulong), &extra1->offset)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(cl_ulong), &extrad->offset)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, k_arg++, sizeof(int), &r3)); + } else { + region.origin = extrad->offset; // Specify the starting offset (in bytes) + region.size = M * N * sizeof(float); // Specify the size of the sub-buffer + C_d = clCreateSubBuffer(extrad->data_device, CL_MEM_WRITE_ONLY, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &status); + CL_CHECK(status); + + int padded_N = ne1 + padding; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0_q4_0->q)); //A_q_dextra0_q4_0->q + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &extra0_q4_0->d)); //A_s_d + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &B_image1d)); //B_d + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_mem), &C_d)); //C_d + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne01)); //M + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &padded_N)); //N with padding + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); //K + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne1)); //N without padding + } + // <--------------------------------------------> // + + // choose workgroup size + // <--------------------------------------------> // + size_t global_work_size[3] = { + 64, static_cast((M+63)/64), static_cast((N+31)/32)}; + size_t local_work_size[3] = {64, 2, 4}; + + global_work_size[0] = (size_t)(ceil((float)ne1/8)); + global_work_size[1] = (size_t)(ne01/4); + global_work_size[2] = (size_t)(1); + + local_work_size[0] = (size_t)(1); //4x32 for FP32 + local_work_size[1] = (size_t)(128); + local_work_size[2] = (size_t)(1); + + //WGS tuning + if (ne0 == 4096 && ne1 == 128 && ne10 == 4096) { + local_work_size[0] = 1; + local_work_size[1] = 128; + } else if (ne0 == 11008 && ne1 == 128 && ne10 == 4096) { + local_work_size[0] = 2; + local_work_size[1] = 64; + } else if (ne0 == 4096 && ne1 == 128 && ne10 == 11008) { + local_work_size[0] = 2; + local_work_size[1] = 64; + } else if (ne0 == 32000 && ne1 == 128 && ne10 == 4096) { + local_work_size[0] = 2; + local_work_size[1] = 64; + } + + if (N == 1) { + local_work_size[0] = backend_ctx->adreno_wave_size; // localsize + local_work_size[1] = 4; // reduce factor + local_work_size[2] = 1; + + global_work_size[0] = M / 2; + global_work_size[1] = 4; // reduce factor + global_work_size[2] = 1; + } + // <--------------------------------------------> // + + // enqueue kernel with profiling + // <--------------------------------------------> // + #ifdef GGML_OPENCL_PROFILING + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); + // enqueue kernel without profiling + #else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); + #endif + // <--------------------------------------------> // + + // deallocate sub buffers and images + // <--------------------------------------------> // + CL_CHECK(clReleaseMemObject(A_image1d)); + CL_CHECK(clReleaseMemObject(B_sub_buffer)); + CL_CHECK(clReleaseMemObject(B_image1d)); + + if (N != 1) { + CL_CHECK(clReleaseMemObject(B_d)); + CL_CHECK(clReleaseMemObject(B_d_input_image)); + CL_CHECK(clReleaseMemObject(C_d)); + } + // <--------------------------------------------> // + + return; + } + } // if (ne01 && ne1) +#endif // GGML_OPENCL_USE_ADRENO_KERNELS + + if (!ggml_is_transposed(src0) && + !ggml_is_transposed(src1) && + src1t == GGML_TYPE_F32 && + ne00%32 == 0 && + ne11 > 2) { +#ifdef GGML_OPENCL_SOA_Q + // Set up kernel. + switch(src0t) { + case GGML_TYPE_Q4_0: + // This should have been satisfied. + GGML_ASSERT(ne11 == ne1); + GGML_ASSERT(ne01 == ne0); + + if (backend_ctx->gpu_family == INTEL) { + nth0 = 16; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32_1d_16x_flat; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 64; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32_1d_8x_flat; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0_q4_0->q)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &extra0_q4_0->d)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &r3)); + break; + default: + break; + } + + // Launch kernel. + if (src0t == GGML_TYPE_Q4_0) { + size_t global_work_size[] = {(size_t)(ne01 + 7)/8*nth0, (size_t)ne11*nth1, (size_t)ne12*ne13}; + size_t local_work_size[] = {(size_t)nth0, (size_t)nth1, 1}; + + if (backend_ctx->gpu_family == INTEL) { + // Set global size for Intel. It uses 16x output values. + global_work_size[0] = (size_t)(ne01 + 15)/16*nth0; + global_work_size[1] = (size_t)ne11*nth1; + global_work_size[2] = (size_t)ne12*ne13; + } + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + return; + } +#else // GGML_OPENCL_SOA_Q + // TODO: add block_q4_0 variant. +#endif // GGML_OPENCL_SOA_Q + } + + // use custom matrix x vector kernel + switch (src0t) { + case GGML_TYPE_F32: + //GGML_ASSERT(ne02 == ne12); + GGML_ASSERT(src1t == GGML_TYPE_F32); + kernel = backend_ctx->kernel_mul_mat_f32_f32; + nrows = 4; + + if (backend_ctx->gpu_family == INTEL) { + nth0 = 32; + nth1 = 1; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 64; + nth1 = 1; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne11)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong), &nb12)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong), &nb13)); + CL_CHECK(clSetKernelArg(kernel, 20, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 21, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 22, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 23, sizeof(int), &r3)); + break; + case GGML_TYPE_F16: + //GGML_ASSERT(ne02 == ne12); + if (backend_ctx->gpu_family == INTEL) { + nth0 = 32; + nth1 = 1; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 64; + nth1 = 1; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + if (src1t == GGML_TYPE_F32) { + if (ne11 * ne12 < 4) { + kernel = backend_ctx->kernel_mul_mat_f16_f32_1row; + } else if (ne00 >= 128 && ne01 >= 8 && ne00%4 == 0) { + kernel = backend_ctx->kernel_mul_mat_f16_f32_l4; + nrows = ne11; + } else { + kernel = backend_ctx->kernel_mul_mat_f16_f32; + nrows = 4; + } + } else { + kernel = backend_ctx->kernel_mul_mat_f16_f16; + nrows = 4; + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne11)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong), &nb12)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong), &nb13)); + CL_CHECK(clSetKernelArg(kernel, 20, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 21, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 22, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 23, sizeof(int), &r3)); + break; + case GGML_TYPE_Q4_0: + // This should have been satisfied. + GGML_ASSERT(ne11 == ne1); + GGML_ASSERT(ne01 == ne0); + +#ifdef GGML_OPENCL_SOA_Q + if (backend_ctx->gpu_family == INTEL) { + nth0 = 16; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32_8x_flat; + ndst = 8; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 64; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32_8x_flat; + ndst =8; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0_q4_0->q)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_mem), &extra0_q4_0->d)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &r3)); +#else // GGML_OPENCL_SOA_Q + if (backend_ctx->gpu_family == INTEL) { + // Use 1D local size. Each workgroup is a SIMD group. Each SIMD + // group produces N_DST (4 for Q4_0 kernel) values in the result. + // The number of workgroups on dim 0 (the leading dimension) is + // the nearest multiple of 4 that covers ne0 (equals ne01). + nth0 = 16; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32; + ndst = 4; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 64; + nth1 = 1; + + kernel = backend_ctx->kernel_mul_mat_q4_0_f32_v; + ndst = 4; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &r3)); +#endif // GGML_OPENCL_SOA_Q + break; + case GGML_TYPE_Q4_1: + case GGML_TYPE_Q8_0: + case GGML_TYPE_Q2_K: + case GGML_TYPE_Q3_K: + case GGML_TYPE_Q4_K: + case GGML_TYPE_Q5_K: + case GGML_TYPE_Q6_K: + kernel = backend_ctx->kernel_mul_mv_q6_K_f32; + + if (backend_ctx->gpu_family == INTEL) { + nth0 = 2; + nth1 = 16; + } else if (backend_ctx->gpu_family == ADRENO) { + nth0 = 2; + nth1 = 64; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &r2)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &r3)); + break; + default: + GGML_ASSERT(false && "not implemented"); + } + + if (src0t == GGML_TYPE_Q4_0 || + src0t == GGML_TYPE_Q4_1 || + src0t == GGML_TYPE_Q8_0 || + src0t == GGML_TYPE_Q2_K) { + // Each SIMD group produces N_DST values in the result. Assuming each + // workgroup has N_SIMDGROUP SIMD groups, then each workgroup will + // produce N_DST*N_SIMDGROUP values in the result. Hence, the grid size + // (number of workgroups) will be a nearest multiple of + // N_DST*N_SIMDGROUP to cover the size of the dimension. Below, 4 is + // N_DST*N_SIMDGROUP (see the kernel for Q4_0 matmul). + size_t global_work_size[] = {(size_t)(ne01 + ndst-1)/ndst*nth0, (size_t)ne11*nth1, (size_t)ne12*ne13}; + size_t local_work_size[] = {(size_t)nth0, (size_t)nth1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } else if (src0t == GGML_TYPE_Q4_K) { + GGML_ASSERT(false && "not implemented"); + } else if (src0t == GGML_TYPE_Q3_K) { + GGML_ASSERT(false && "not implemented"); + } else if (src0t == GGML_TYPE_Q5_K) { + GGML_ASSERT(false && "not implemented"); + } else if (src0t == GGML_TYPE_Q6_K) { + size_t global_work_size[] = {(size_t)(ne01+1)/2*nth0, (size_t)ne11*nth1, (size_t)ne12*ne13}; + size_t local_work_size[] = {(size_t)nth0, (size_t)nth1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } else { + int64_t ny = (ne11 + nrows - 1)/nrows; + + size_t global_work_size[] = {(size_t)ne01*nth0, (size_t)ny*nth1, (size_t)ne12*ne13}; + size_t local_work_size[] = {(size_t)nth0, (size_t)nth1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } +} + +static void ggml_cl_scale(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + GGML_UNUSED(src1); + + GGML_ASSERT(ggml_is_contiguous(src0)); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + float scale; + memcpy(&scale, dst->op_params, sizeof(scale)); + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel = backend_ctx->kernel_scale; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(float), &scale)); + + int n = ggml_nelements(dst)/4; + + size_t global_work_size[] = {(size_t)n, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_cpy(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + + // GGML_OP_CPY happens between src0 and src1. + // GGML_OP_DUP and GGML_OP_CONT happen between src0 and dst. + UNUSED(dst); + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + const cl_ulong nb00 = src0 ? src0->nb[0] : 0; + const cl_ulong nb01 = src0 ? src0->nb[1] : 0; + const cl_ulong nb02 = src0 ? src0->nb[2] : 0; + const cl_ulong nb03 = src0 ? src0->nb[3] : 0; + + const int ne10 = src1 ? src1->ne[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; + const int ne12 = src1 ? src1->ne[2] : 0; + const int ne13 = src1 ? src1->ne[3] : 0; + + const cl_ulong nb10 = src1 ? src1->nb[0] : 0; + const cl_ulong nb11 = src1 ? src1->nb[1] : 0; + const cl_ulong nb12 = src1 ? src1->nb[2] : 0; + const cl_ulong nb13 = src1 ? src1->nb[3] : 0; + + const enum ggml_type src0t = src0 ? src0->type : GGML_TYPE_COUNT; + const enum ggml_type src1t = src1 ? src1->type : GGML_TYPE_COUNT; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + + cl_kernel kernel; + + switch (src0t) { + case GGML_TYPE_F32: + switch (src1t) { + case GGML_TYPE_F16: + kernel = backend_ctx->kernel_cpy_f32_f16; + break; + case GGML_TYPE_F32: + kernel = backend_ctx->kernel_cpy_f32_f32; + break; + default: + GGML_ASSERT(false && "not implemented"); + } + break; + case GGML_TYPE_F16: + switch (src1t) { + case GGML_TYPE_F16: + kernel = backend_ctx->kernel_cpy_f16_f16; + break; + case GGML_TYPE_F32: + kernel = backend_ctx->kernel_cpy_f16_f32; + break; + default: + GGML_ASSERT(false && "not implemented"); + } + break; + default: + GGML_ASSERT(false && "not implemented"); + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne03)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(int), &ne10)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &ne11)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(int), &ne13)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(cl_ulong), &nb10)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(cl_ulong), &nb11)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(cl_ulong), &nb12)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(cl_ulong), &nb13)); + + const int nth = MIN(64, ne00); + + size_t global_work_size[] = {(size_t)ne01*nth, (size_t)ne02, (size_t)ne03}; + size_t local_work_size[] = {(size_t)nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, src1); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_dup(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + ggml_cl_cpy(backend, src0, dst, nullptr); + UNUSED(src1); +} + +static void ggml_cl_diag_mask_inf(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + UNUSED(src1); + + int n_past = ((int32_t *)(dst->op_params))[0]; + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_kernel kernel; + + if (ne00%8 == 0) { + kernel = backend_ctx->kernel_diag_mask_inf_8; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &n_past)); + + size_t global_work_size[] = {(size_t)ne00*ne01*ne02/8, 1, 1}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } else { + kernel = backend_ctx->kernel_diag_mask_inf; + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &n_past)); + + size_t global_work_size[] = {(size_t)ne00, (size_t)ne01, (size_t)ne02}; + size_t local_work_size[] = {64, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif + } +} + +static void ggml_cl_soft_max(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + // Softmax can now fuse KQ mask and KQ scale, which used to be two additional + // ops before softmax. It now also fuses alibi if `max_bias > 0`. For llama, + // alibi is not used; however, for some other models, it is used. + // KQ_mask + if (src1) { + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + } + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + ggml_tensor_extra_cl * extra1 = src1 ? (ggml_tensor_extra_cl *)src1->extra : nullptr; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + cl_ulong offset1 = extra1 ? extra1->offset + src1->view_offs : offset0; + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + float scale, max_bias; + memcpy(&scale, dst->op_params + 0, sizeof(float)); + memcpy(&max_bias, dst->op_params + 1, sizeof(float)); + + const int nrows_x = ggml_nrows(src0); + const int nrows_y = src0->ne[1]; + + const int n_head = nrows_x/nrows_y; + const int n_head_log2 = 1u << (uint32_t) floorf(log2f((float) n_head)); + + const float m0 = powf(2.0f, -(max_bias ) / n_head_log2); + const float m1 = powf(2.0f, -(max_bias / 2.0f) / n_head_log2); + + // Local size must be wave size. Each workgroup is a wave, working on a row, + // where a row corresponds to leading dimension. + int nth = MIN(32, ne00); + + if (backend_ctx->gpu_family == INTEL) { + // This is the same as the initial value. + nth = MIN(32, ne00); + } + else if (backend_ctx->gpu_family == ADRENO) { + nth = 64; + } else { + GGML_ASSERT(false && "TODO: Unknown GPU"); + } + + cl_kernel kernel; + + if (ne00%4 == 0) { + kernel = backend_ctx->kernel_soft_max_4; + } else { + kernel = backend_ctx->kernel_soft_max; + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), extra1 ? &extra1->data_device : &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(float), &scale)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(float), &max_bias)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(float), &m0)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(float), &m1)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(int), &n_head_log2)); + + size_t global_work_size[] = {(size_t)ne01*nth, (size_t)ne02, (size_t)ne03}; + size_t local_work_size[] = {(size_t)nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +static void ggml_cl_rope(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + GGML_ASSERT(src0); + GGML_ASSERT(src0->extra); + GGML_ASSERT(src1); + GGML_ASSERT(src1->extra); + GGML_ASSERT(dst); + GGML_ASSERT(dst->extra); + + ggml_backend_opencl_context *backend_ctx = (ggml_backend_opencl_context *)backend->context; + cl_command_queue queue = backend_ctx->queue; + + ggml_tensor_extra_cl * extra0 = (ggml_tensor_extra_cl *)src0->extra; + ggml_tensor_extra_cl * extra1 = (ggml_tensor_extra_cl *)src1->extra; + ggml_tensor_extra_cl * extrad = (ggml_tensor_extra_cl *)dst->extra; + + cl_ulong offset0 = extra0->offset + src0->view_offs; + cl_ulong offset1 = extra1->offset + src1->view_offs; + cl_ulong offsetd = extrad->offset + dst->view_offs; + + ggml_tensor * src2 = dst->src[2]; + ggml_tensor_extra_cl * extra2 = src2 ? (ggml_tensor_extra_cl *)src2->extra : nullptr; + + cl_ulong offset2 = extra2 ? extra2->offset + src2->view_offs : offset0; + + const int ne00 = src0 ? src0->ne[0] : 0; + const int ne01 = src0 ? src0->ne[1] : 0; + const int ne02 = src0 ? src0->ne[2] : 0; + const int ne03 = src0 ? src0->ne[3] : 0; + + const int nb00 = src0 ? src0->nb[0] : 0; + const int nb01 = src0 ? src0->nb[1] : 0; + const int nb02 = src0 ? src0->nb[2] : 0; + const int nb03 = src0 ? src0->nb[3] : 0; + + const int ne10 = src1 ? src1->ne[0] : 0; + const int ne11 = src1 ? src1->ne[1] : 0; UNUSED(ne11); + const int ne12 = src1 ? src1->ne[2] : 0; UNUSED(ne12); + const int ne13 = src1 ? src1->ne[3] : 0; UNUSED(ne13); + + const int ne0 = dst ? dst->ne[0] : 0; + const int ne1 = dst ? dst->ne[1] : 0; + const int ne2 = dst ? dst->ne[2] : 0; + const int ne3 = dst ? dst->ne[3] : 0; + + const int nb0 = dst ? dst->nb[0] : 0; + const int nb1 = dst ? dst->nb[1] : 0; + const int nb2 = dst ? dst->nb[2] : 0; + const int nb3 = dst ? dst->nb[3] : 0; + + GGML_ASSERT(ne10 == ne02); + + int nth = MIN(64, ne00); + + const int n_past = ((int *) dst->op_params)[0]; + const int n_dims = ((int *) dst->op_params)[1]; + const int mode = ((int *) dst->op_params)[2]; + const int n_ctx_orig = ((int32_t *) dst->op_params)[4]; + + float freq_base; + float freq_scale; + float ext_factor; + float attn_factor; + float beta_fast; + float beta_slow; + + memcpy(&freq_base, (int32_t *) dst->op_params + 5, sizeof(float)); + memcpy(&freq_scale, (int32_t *) dst->op_params + 6, sizeof(float)); + memcpy(&ext_factor, (int32_t *) dst->op_params + 7, sizeof(float)); + memcpy(&attn_factor, (int32_t *) dst->op_params + 8, sizeof(float)); + memcpy(&beta_fast, (int32_t *) dst->op_params + 9, sizeof(float)); + memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); + + const bool is_neox = mode & 2; + + cl_kernel kernel; + + if (!is_neox) { + switch (src0->type) { + case GGML_TYPE_F32: + kernel = backend_ctx->kernel_rope_norm_f32; + break; + case GGML_TYPE_F16: + kernel = backend_ctx->kernel_rope_norm_f16; + break; + default: + GGML_ASSERT(false); + }; + } else { + switch (src0->type) { + case GGML_TYPE_F32: + kernel = backend_ctx->kernel_rope_neox_f32; + break; + case GGML_TYPE_F16: + kernel = backend_ctx->kernel_rope_neox_f16; + break; + default: + GGML_ASSERT(false); + }; + } + + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); + CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); + CL_CHECK(clSetKernelArg(kernel, 3, sizeof(cl_ulong), &offset1)); + CL_CHECK(clSetKernelArg(kernel, 4, sizeof(cl_mem), extra2 ? &extra2->data_device : &extra0->data_device)); + CL_CHECK(clSetKernelArg(kernel, 5, sizeof(cl_ulong), &offset2)); + CL_CHECK(clSetKernelArg(kernel, 6, sizeof(cl_mem), &extrad->data_device)); + CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_ulong), &offsetd)); + CL_CHECK(clSetKernelArg(kernel, 8, sizeof(int), &ne00)); + CL_CHECK(clSetKernelArg(kernel, 9, sizeof(int), &ne01)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne02)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne03)); + CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb00)); + CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong), &nb01)); + CL_CHECK(clSetKernelArg(kernel, 14, sizeof(cl_ulong), &nb02)); + CL_CHECK(clSetKernelArg(kernel, 15, sizeof(cl_ulong), &nb03)); + CL_CHECK(clSetKernelArg(kernel, 16, sizeof(int), &ne0)); + CL_CHECK(clSetKernelArg(kernel, 17, sizeof(int), &ne1)); + CL_CHECK(clSetKernelArg(kernel, 18, sizeof(int), &ne2)); + CL_CHECK(clSetKernelArg(kernel, 19, sizeof(int), &ne3)); + CL_CHECK(clSetKernelArg(kernel, 20, sizeof(cl_ulong), &nb0)); + CL_CHECK(clSetKernelArg(kernel, 21, sizeof(cl_ulong), &nb1)); + CL_CHECK(clSetKernelArg(kernel, 22, sizeof(cl_ulong), &nb2)); + CL_CHECK(clSetKernelArg(kernel, 23, sizeof(cl_ulong), &nb3)); + CL_CHECK(clSetKernelArg(kernel, 24, sizeof(int), &n_past)); + CL_CHECK(clSetKernelArg(kernel, 25, sizeof(int), &n_dims)); + CL_CHECK(clSetKernelArg(kernel, 26, sizeof(int), &n_ctx_orig)); + CL_CHECK(clSetKernelArg(kernel, 27, sizeof(float), &freq_base)); + CL_CHECK(clSetKernelArg(kernel, 28, sizeof(float), &freq_scale)); + CL_CHECK(clSetKernelArg(kernel, 29, sizeof(float), &ext_factor)); + CL_CHECK(clSetKernelArg(kernel, 30, sizeof(float), &attn_factor)); + CL_CHECK(clSetKernelArg(kernel, 31, sizeof(float), &beta_fast)); + CL_CHECK(clSetKernelArg(kernel, 32, sizeof(float), &beta_slow)); + + size_t global_work_size[] = {(size_t)ne01*nth, (size_t)ne02, (size_t)ne03}; + size_t local_work_size[] = {(size_t)nth, 1, 1}; + +#ifdef GGML_OPENCL_PROFILING + cl_event evt; + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &evt)); + + g_profiling_info.emplace_back(); + populateProfilingInfo(g_profiling_info.back(), evt, kernel, global_work_size, local_work_size, dst); +#else + CL_CHECK(clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, NULL)); +#endif +} + +//------------------------------------------------------------------------------ +// Op offloading +//------------------------------------------------------------------------------ + +typedef void (*ggml_cl_func_t)(ggml_backend_t backend, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst); + +bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor) { + ggml_cl_func_t func = nullptr; + + ggml_tensor * src0 = tensor->src[0]; + ggml_tensor * src1 = tensor->src[1]; + + const bool any_on_device = tensor->extra + || (src0 != nullptr && src0->extra) + || (src1 != nullptr && src1->extra); + + switch (tensor->op) { + case GGML_OP_GET_ROWS: + if (!any_on_device) { + return false; + } + func = ggml_cl_get_rows; + break; + case GGML_OP_CPY: + if (!any_on_device) { + return false; + } + func = ggml_cl_cpy; + break; + case GGML_OP_DUP: + case GGML_OP_CONT: + if (!any_on_device) { + return false; + } + func = ggml_cl_dup; + break; + case GGML_OP_ADD: + if (!any_on_device) { + return false; + } + GGML_ASSERT(ggml_is_contiguous(src0)); + GGML_ASSERT(ggml_is_contiguous(src1)); + func = ggml_cl_add; + break; + case GGML_OP_MUL: + if (!any_on_device) { + return false; + } + func = ggml_cl_mul; + break; + case GGML_OP_UNARY: + switch (ggml_get_unary_op(tensor)) { + case GGML_UNARY_OP_GELU: + if (!any_on_device) { + return false; + } + func = ggml_cl_gelu; + break; + case GGML_UNARY_OP_SILU: + if (!any_on_device) { + return false; + } + func = ggml_cl_silu; + break; + case GGML_UNARY_OP_RELU: + if (!any_on_device) { + return false; + } + func = ggml_cl_relu; + break; + default: + return false; + } break; + case GGML_OP_CLAMP: + if (!any_on_device) { + return false; + } + func = ggml_cl_clamp; + break; + case GGML_OP_NORM: + if (!any_on_device) { + return false; + } + func = ggml_cl_norm; + break; + case GGML_OP_RMS_NORM: + if (!any_on_device) { + return false; + } + func = ggml_cl_rms_norm; + break; + case GGML_OP_MUL_MAT: + if (!any_on_device && !ggml_cl_can_mul_mat(tensor->src[0], tensor->src[1], tensor)) { + return false; + } + func = ggml_cl_mul_mat; + break; + case GGML_OP_SCALE: + if (!any_on_device) { + return false; + } + func = ggml_cl_scale; + break; + case GGML_OP_RESHAPE: + case GGML_OP_VIEW: + case GGML_OP_PERMUTE: + case GGML_OP_TRANSPOSE: + if (!any_on_device) { + return false; + } + func = ggml_cl_nop; + break; + case GGML_OP_DIAG_MASK_INF: + if (!any_on_device) { + return false; + } + func = ggml_cl_diag_mask_inf; + break; + case GGML_OP_SOFT_MAX: + if (!any_on_device) { + return false; + } + func = ggml_cl_soft_max; + break; + case GGML_OP_ROPE: + if (!any_on_device) { + return false; + } + func = ggml_cl_rope; + break; + default: + return false; + } + + func(backend, tensor->src[0], tensor->src[1], tensor); + return true; +} diff --git a/ggml/src/ggml-opencl/kernels/embed_kernel.py b/ggml/src/ggml-opencl/kernels/embed_kernel.py new file mode 100644 index 000000000..b5d1d7242 --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/embed_kernel.py @@ -0,0 +1,26 @@ +# + +import sys +import logging +logger = logging.getLogger("opencl-embed-kernel") + + +def main(): + logging.basicConfig(level=logging.INFO) + + if len(sys.argv) != 3: + logger.info("Usage: python embed_kernel.py ") + sys.exit(1) + + ifile = open(sys.argv[1], "r") + ofile = open(sys.argv[2], "w") + + for i in ifile: + ofile.write('R"({})"\n'.format(i)) + + ifile.close() + ofile.close() + + +if __name__ == "__main__": + main() diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl.cl new file mode 100644 index 000000000..d1cdf709b --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl.cl @@ -0,0 +1,2683 @@ +#ifdef cl_khr_fp16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#elif defined(cl_amd_fp16) +#pragma OPENCL EXTENSION cl_amd_fp16 : enable +#else +#error "Half precision floating point not supportedby OpenCL implementation on your device." +#endif + +#ifdef cl_khr_subgroups +#pragma OPENCL EXTENSION cl_khr_subgroups : enable +#elif defined(cl_intel_subgroups) +#pragma OPENCL EXTENSION cl_intel_subgroups : enable +#else +#error "Subgroup not supported on your device." +#endif + +#ifdef cl_intel_required_subgroup_size +// Always use subgroup size of 32 on Intel. +#pragma OPENCL EXTENSION cl_intel_required_subgroup_size : enable +#define INTEL_GPU 1 +#define REQD_SUBGROUP_SIZE_16 __attribute__((intel_reqd_sub_group_size(16))) +#define REQD_SUBGROUP_SIZE_32 __attribute__((intel_reqd_sub_group_size(32))) +#elif defined(cl_qcom_reqd_sub_group_size) +// Always use subgroups size of 64 on Adreno. +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable +#define ADRENO_GPU 1 +#define REQD_SUBGROUP_SIZE_64 __attribute__((qcom_reqd_sub_group_size("half"))) +#define REQD_SUBGROUP_SIZE_128 __attribute__((qcom_reqd_sub_group_size("full"))) +#else +// TODO: do not know how to choose subgroup size on other GPUs. +#error "Selecting subgroup size is not supported on your device." +#endif + +#define QK4_0 32 +#define QR4_0 2 +#define QK4_1 32 +#define QR4_1 2 +#define QK5_0 32 +#define QR5_0 2 +#define QK5_1 32 +#define QR5_1 2 +#define QK8_0 32 +#define QR8_0 1 +#define QK_K 256 +#define K_QUANTS_PER_ITERATION 2 + +typedef char int8_t; +typedef uchar uint8_t; +typedef short int16_t; +typedef ushort uint16_t; +typedef int int32_t; +typedef uint uint32_t; + +//------------------------------------------------------------------------------ +// block_q4_0 +//------------------------------------------------------------------------------ +struct block_q4_0 +{ + half d; + uint8_t qs[QK4_0 / 2]; +}; + +//------------------------------------------------------------------------------ +// block_q4_1 +//------------------------------------------------------------------------------ +struct block_q4_1 +{ + half d; + half m; + uint8_t qs[QK4_1 / 2]; +}; + +//------------------------------------------------------------------------------ +// block_q5_0 +//------------------------------------------------------------------------------ +struct block_q5_0 +{ + half d; + uint32_t qh; + uint8_t qs[QK5_0 / 2]; +}; + +//------------------------------------------------------------------------------ +// block_q5_1 +//------------------------------------------------------------------------------ +struct block_q5_1 +{ + half d; + half m; + uint32_t qh; + uint8_t qs[QK5_1 / 2]; +}; + +//------------------------------------------------------------------------------ +// block_q8_0 +//------------------------------------------------------------------------------ +struct block_q8_0 +{ + half d; + int8_t qs[QK8_0]; +}; + +//------------------------------------------------------------------------------ +// block_q2_K +//------------------------------------------------------------------------------ +struct block_q2_K +{ + uint8_t scales[16]; + uint8_t qs[64]; + half d; + half dmin; +}; + +//------------------------------------------------------------------------------ +// block_q3_K +//------------------------------------------------------------------------------ +struct block_q3_K +{ + uint8_t hmask[32]; + uint8_t qs[64]; + uint8_t scales[12]; + half d; +}; + +//------------------------------------------------------------------------------ +// block_q4_K +//------------------------------------------------------------------------------ +struct block_q4_K +{ + half d; + half dmin; + uint8_t scales[12]; + uint8_t qs[128]; +}; + +//------------------------------------------------------------------------------ +// block_q5_K +//------------------------------------------------------------------------------ +struct block_q5_K +{ + half d; + half dmin; + uint8_t scales[12]; + uint8_t qh[32]; + uint8_t qs[128]; +}; + +//------------------------------------------------------------------------------ +// block_q6_K +//------------------------------------------------------------------------------ +struct block_q6_K +{ + uint8_t ql[128]; + uint8_t qh[64]; + int8_t scales[16]; + half d; +}; + +//------------------------------------------------------------------------------ +// dequantize_q4_0_f32, dequantize_q4_0_f16 +//------------------------------------------------------------------------------ +void dequantize_q4_0_f32(global struct block_q4_0 * xb, short il, float16 * reg) { + global ushort * qs = ((global ushort *)xb + 1); + float d1 = il ? (xb->d / 16.h) : xb->d; + float d2 = d1 / 256.f; + float md = -8.h * xb->d; + ushort mask0 = il ? 0x00F0 : 0x000F; + ushort mask1 = mask0 << 8; + + reg->s0 = d1 * (qs[0] & mask0) + md; + reg->s1 = d2 * (qs[0] & mask1) + md; + + reg->s2 = d1 * (qs[1] & mask0) + md; + reg->s3 = d2 * (qs[1] & mask1) + md; + + reg->s4 = d1 * (qs[2] & mask0) + md; + reg->s5 = d2 * (qs[2] & mask1) + md; + + reg->s6 = d1 * (qs[3] & mask0) + md; + reg->s7 = d2 * (qs[3] & mask1) + md; + + reg->s8 = d1 * (qs[4] & mask0) + md; + reg->s9 = d2 * (qs[4] & mask1) + md; + + reg->sa = d1 * (qs[5] & mask0) + md; + reg->sb = d2 * (qs[5] & mask1) + md; + + reg->sc = d1 * (qs[6] & mask0) + md; + reg->sd = d2 * (qs[6] & mask1) + md; + + reg->se = d1 * (qs[7] & mask0) + md; + reg->sf = d2 * (qs[7] & mask1) + md; +} + +void dequantize_q4_0_f16(global struct block_q4_0 * xb, short il, half16 * reg) { + global ushort * qs = ((global ushort *)xb + 1); + half d1 = il ? (xb->d / 16.h) : xb->d; + half d2 = d1 / 256.h; + half md = -8.h * xb->d; + ushort mask0 = il ? 0x00F0 : 0x000F; + ushort mask1 = mask0 << 8; + + reg->s0 = d1 * (qs[0] & mask0) + md; + reg->s1 = d2 * (qs[0] & mask1) + md; + + reg->s2 = d1 * (qs[1] & mask0) + md; + reg->s3 = d2 * (qs[1] & mask1) + md; + + reg->s4 = d1 * (qs[2] & mask0) + md; + reg->s5 = d2 * (qs[2] & mask1) + md; + + reg->s6 = d1 * (qs[3] & mask0) + md; + reg->s7 = d2 * (qs[3] & mask1) + md; + + reg->s8 = d1 * (qs[4] & mask0) + md; + reg->s9 = d2 * (qs[4] & mask1) + md; + + reg->sa = d1 * (qs[5] & mask0) + md; + reg->sb = d2 * (qs[5] & mask1) + md; + + reg->sc = d1 * (qs[6] & mask0) + md; + reg->sd = d2 * (qs[6] & mask1) + md; + + reg->se = d1 * (qs[7] & mask0) + md; + reg->sf = d2 * (qs[7] & mask1) + md; +} + +//------------------------------------------------------------------------------ +// add +//------------------------------------------------------------------------------ + +// general-purpose kernel for addition of two tensors +// pros: works for non-contiguous tensors, supports broadcast across dims 1, 2 and 3 +// cons: not very efficient +kernel void kernel_add( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global char * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + int ne13, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + src0 = src0 + offset0; + src1 = src1 + offset1; + dst = dst + offsetd; + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int i13 = i03 % ne13; + int i12 = i02 % ne12; + int i11 = i01 % ne11; + + global char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01; + global char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11; + global char * dst_ptr = dst + i03*nb3 + i02*nb2 + i01*nb1; + + for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { + const int i10 = i0 % ne10; + *((global float *)(dst_ptr + i0*nb0)) = *((global float *)(src0_ptr + i0*nb00)) + *((global float *)(src1_ptr + i10*nb10)); + } +} + +// assumption: src1 is a row +// broadcast src1 into src0 +kernel void kernel_add_row( + global float4 * src0, + ulong offset0, + global float4 * src1, + ulong offset1, + global float4 * dst, + ulong offsetd, + int ne +) { + src0 = (global float4*)((global char*)src0 + offset0); + src1 = (global float4*)((global char*)src1 + offset1); + dst = (global float4*)((global char*)dst + offsetd); + + // This performs better than using %. + uint gid = get_global_id(0); + uint idx1 = gid - (gid/ne)*ne; // get_global_id(0) % ne + dst[gid] = src0[gid] + src1[idx1]; +} + +//------------------------------------------------------------------------------ +// mul +//------------------------------------------------------------------------------ +kernel void kernel_mul( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global char * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + int ne13, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + src0 = src0 + offset0; + src1 = src1 + offset1; + dst = dst + offsetd; + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int i13 = i03 % ne13; + int i12 = i02 % ne12; + int i11 = i01 % ne11; + + global char * src0_ptr = src0 + i03*nb03 + i02*nb02 + i01*nb01; + global char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11; + global char * dst_ptr = dst + i03*nb3 + i02*nb2 + i01*nb1; + + for (int i0 = get_local_id(0); i0 < ne0; i0 += get_local_size(0)) { + const int i10 = i0 % ne10; + *((global float *)(dst_ptr + i0*nb0)) = *((global float *)(src0_ptr + i0*nb00)) * *((global float *)(src1_ptr + i10*nb10)); + } +} + +// assumption: src1 is a row +// broadcast src1 into src0 +kernel void kernel_mul_row( + global float4 * src0, + ulong offset0, + global float4 * src1, + ulong offset1, + global float4 * dst, + ulong offsetd, + int ne +) { + src0 = (global float4*)((global char*)src0 + offset0); + src1 = (global float4*)((global char*)src1 + offset1); + dst = (global float4*)((global char*)dst + offsetd); + + // This performs better than using %. + uint gid = get_global_id(0); + uint idx1 = gid - (gid/ne)*ne; // get_global_id(0) % ne + dst[gid] = src0[gid] * src1[idx1]; +} + +//------------------------------------------------------------------------------ +// scale +//------------------------------------------------------------------------------ +kernel void kernel_scale( + global float4 * src0, + ulong offset0, + global float4 * dst, + ulong offsetd, + float scale +) { + src0 = (global float4*)((global char*)src0 + offset0); + dst = (global float4*)((global char*)dst + offsetd); + dst[get_global_id(0)] = src0[get_global_id(0)] * scale; +} + +//------------------------------------------------------------------------------ +// gelu +//------------------------------------------------------------------------------ +#define GELU_COEF_A 0.044715f +#define SQRT_2_OVER_PI 0.79788456080286535587989211986876f + +kernel void kernel_gelu( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + float x = src0[get_global_id(0)]; + + dst[get_global_id(0)] = 0.5f*x*(1.0f + tanh(SQRT_2_OVER_PI*x*(1.0f + GELU_COEF_A*x*x))); +} + +kernel void kernel_gelu_4( + global float4 * src0, + ulong offset0, + global float4 * dst, + ulong offsetd +) { + src0 = (global float4*)((global char*)src0 + offset0); + dst = (global float4*)((global char*)dst + offsetd); + + float4 x = src0[get_global_id(0)]; + + dst[get_global_id(0)] = 0.5f*x*(1.0f + tanh(SQRT_2_OVER_PI*x*(1.0f + GELU_COEF_A*x*x))); +} + +//------------------------------------------------------------------------------ +// silu +//------------------------------------------------------------------------------ +kernel void kernel_silu( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + float x = src0[get_global_id(0)]; + dst[get_global_id(0)] = x / (1.0f + exp(-x)); +} + +kernel void kernel_silu_4( + global float4 * src0, + ulong offset0, + global float4 * dst, + ulong offsetd +) { + src0 = (global float4*)((global char*)src0 + offset0); + dst = (global float4*)((global char*)dst + offsetd); + + float4 x = src0[get_global_id(0)]; + dst[get_global_id(0)] = x / (1.0f + exp(-x)); +} + +//------------------------------------------------------------------------------ +// relu +//------------------------------------------------------------------------------ +kernel void kernel_relu( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + dst[get_global_id(0)] = fmax(0.0f, src0[get_global_id(0)]); +} + +//------------------------------------------------------------------------------ +// clamp +//------------------------------------------------------------------------------ +kernel void kernel_clamp( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd, + float min, + float max +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + dst[get_global_id(0)] = src0[get_global_id(0)] < min ? + min : + (src0[get_global_id(0)] > max ? max : src0[get_global_id(0)]); +} + +//------------------------------------------------------------------------------ +// norm +//------------------------------------------------------------------------------ +kernel void kernel_norm( + global void * src0, + ulong offset0, + global float * dst, + ulong offsetd, + int ne00, + ulong nb01, + float eps, + local float * sum +) { + src0 = (global void*)((global char*)src0 + offset0); + dst = (global void*)((global char*)dst + offsetd); + + global float * x = (global float *) ((global char *) src0 + get_group_id(0)*nb01); + + // MEAN + // parallel sum + sum[get_local_id(0)] = 0.0f; + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + sum[get_local_id(0)] += x[i00]; + } + // reduce + barrier(CLK_LOCAL_MEM_FENCE); + for (uint i = get_local_size(0)/2; i > 0; i /= 2) { + if (get_local_id(0) < i) { + sum[get_local_id(0)] += sum[get_local_id(0) + i]; + } + barrier(CLK_LOCAL_MEM_FENCE); + } + float mean = sum[0] / ne00; + + // recenter and VARIANCE + barrier(CLK_LOCAL_MEM_FENCE); + global float * y = dst + get_group_id(0)*ne00; + sum[get_local_id(0)] = 0.0f; + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + y[i00] = x[i00] - mean; + sum[get_local_id(0)] += y[i00] * y[i00]; + } + + // reduce + barrier(CLK_LOCAL_MEM_FENCE); + for (uint i = get_local_size(0)/2; i > 0; i /= 2) { + if (get_local_id(0) < i) { + sum[get_local_id(0)] += sum[get_local_id(0) + i]; + } + barrier(CLK_LOCAL_MEM_FENCE); + } + float variance = sum[0] / ne00; + + float scale = 1.0f/sqrt(variance + eps); + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + y[i00] = y[i00] * scale; + } +} + +//------------------------------------------------------------------------------ +// rms_norm +//------------------------------------------------------------------------------ +// This kernel depends on subgroup size. +kernel void kernel_rms_norm( + global void * src0, + ulong offset0, + global float * dst, + ulong offsetd, + int ne00, + ulong nb01, + float eps, + local float * sum // Note, the size depends on number of subgroups +) { + src0 = (global void*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + global float4 * x = (global float4 *) ((global char *) src0 + get_group_id(0)*nb01); + global float * x_scalar = (global float *) x; + float4 sumf = 0; + float all_sum = 0; + + // parallel sum + for (int i00 = get_local_id(0); i00 < ne00/4; i00 += get_local_size(0)) { + sumf += x[i00] * x[i00]; + } + all_sum = sumf.s0 + sumf.s1 + sumf.s2 + sumf.s3; + all_sum = sub_group_reduce_add(all_sum); + if (get_sub_group_local_id() == 0) { + sum[get_sub_group_id()] = all_sum; + } + + barrier(CLK_LOCAL_MEM_FENCE); + // broadcast + for (uint i = get_local_size(0) / get_max_sub_group_size() / 2; i > 0; i /= 2) { + if (get_local_id(0) < i) { + sum[get_local_id(0)] += sum[get_local_id(0) + i]; + } + } + if (get_local_id(0) == 0) { + for (int i = 4 * (ne00 / 4); i < ne00; i++) { + sum[0] += x_scalar[i]; + } + sum[0] /= ne00; + } + + barrier(CLK_LOCAL_MEM_FENCE); + + const float mean = sum[0]; + const float scale = 1.0f/sqrt(mean + eps); + + global float4 * y = (global float4 *) (dst + get_group_id(0)*ne00); + global float * y_scalar = (global float *) y; + for (int i00 = get_local_id(0); i00 < ne00/4; i00 += get_local_size(0)) { + y[i00] = x[i00] * scale; + } + if (get_local_id(0) == 0) { + for (int i00 = 4 * (ne00 / 4); i00 < ne00; i00++) { + y_scalar[i00] = x_scalar[i00] * scale; + } + } +} + +//------------------------------------------------------------------------------ +// diag_mask_inf kernels +//------------------------------------------------------------------------------ +kernel void kernel_diag_mask_inf( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int n_past +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + int i02 = get_global_id(2); + int i01 = get_global_id(1); + int i00 = get_global_id(0); + + if (i00 > n_past + i01) { + dst[i02*ne01*ne00 + i01*ne00 + i00] = -INFINITY; + } else { + dst[i02*ne01*ne00 + i01*ne00 + i00] = src0[i02*ne01*ne00 + i01*ne00 + i00]; + } +} + +kernel void kernel_diag_mask_inf_8( + global float4 * src0, + ulong offset0, + global float4 * dst, + ulong offsetd, + int ne00, + int ne01, + int n_past +) { + src0 = (global float4*)((global char*)src0 + offset0); + dst = (global float4*)((global char*)dst + offsetd); + + int i = 2*get_global_id(0); + + dst[i+0] = src0[i+0]; + dst[i+1] = src0[i+1]; + int i4 = 4*i; + int i02 = i4/(ne00*ne01); i4 -= i02*ne00*ne01; + int i01 = i4/(ne00); i4 -= i01*ne00; + int i00 = i4; + for (int k = 3; k >= 0; --k) { + if (i00 + 4 + k <= n_past + i01) { + break; + } + (&dst[i+1])[k] = -INFINITY; + if (i00 + k > n_past + i01) { + (&dst[i])[k] = -INFINITY; + } + } +} + +//------------------------------------------------------------------------------ +// softmax +//------------------------------------------------------------------------------ +kernel void kernel_soft_max( + global float * src0, + ulong offset0, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + float scale, + float max_bias, + float m0, + float m1, + int n_head_log2 +) { + src0 = (global float*)((global char*)src0 + offset0); + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + global float * psrc0 = src0 + i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + global float * pmask = src1 != src0 ? src1 + i01*ne00 : 0; + global float * pdst = dst + i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + + float slope = 1.0f; + + // ALiBi + if (max_bias > 0.0f) { + int h = i02; + + float base = h < n_head_log2 ? m0 : m1; + int exp = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1; + + slope = pow(base, exp); + } + + // parallel max + float lmax = -INFINITY; + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + lmax = fmax(lmax, psrc0[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f)); + } + float max = sub_group_reduce_max(lmax); + + // parallel sum + float lsum = 0.0f; + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + float exp_psrc0 = exp((psrc0[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f)) - max); + lsum += exp_psrc0; + // Remember the result of exp here. exp is expensive, so we really do not + // wish to compute it twice. + pdst[i00] = exp_psrc0; + } + + const float sum = sub_group_reduce_add(lsum); + + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + pdst[i00] /= sum; + } +} + +#ifdef ADRENO_GPU +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_soft_max_4( + global float * src0, + ulong offset0, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + float scale, + float max_bias, + float m0, + float m1, + int n_head_log2 +) { + src0 = (global float*)((global char*)src0 + offset0); + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + global float4 * psrc4 = (global float4 *)(src0 + i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00); + global float4 * pmask = src1 != src0 ? (global float4 *)(src1 + i01*ne00) : 0; + global float4 * pdst4 = (global float4 *)(dst + i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00); + + float slope = 1.0f; + + // ALiBi + if (max_bias > 0.0f) { + int h = i02; + + float base = h < n_head_log2 ? m0 : m1; + int exp = h < n_head_log2 ? h + 1 : 2*(h - n_head_log2) + 1; + + slope = pow(base, exp); + } + + // parallel max + float4 lmax4 = -INFINITY; + for (int i00 = get_local_id(0); i00 < ne00/4; i00 += get_local_size(0)) { + lmax4 = fmax(lmax4, psrc4[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f)); + } + float lmax = fmax(fmax(lmax4.s0, lmax4.s1), fmax(lmax4.s2, lmax4.s3)); + + const float max = sub_group_reduce_max(lmax); + + // parallel sum + float4 lsum4 = 0.0f; + for (int i00 = get_local_id(0); i00 < ne00/4; i00 += get_local_size(0)) { + const float4 exp_psrc4 = exp((psrc4[i00]*scale + (pmask ? slope*pmask[i00] : 0.0f)) - max); + lsum4 += exp_psrc4; + pdst4[i00] = exp_psrc4; + } + float lsum = lsum4.s0 + lsum4.s1 + lsum4.s2 + lsum4.s3; + + const float sum = sub_group_reduce_add(lsum); + + for (int i00 = get_local_id(0); i00 < ne00/4; i00 += get_local_size(0)) { + pdst4[i00] /= sum; + } +} + +//------------------------------------------------------------------------------ +// kernel_rope +//------------------------------------------------------------------------------ +float rope_yarn_ramp(float low, float high, int i0) { + const float y = (i0 / 2 - low) / max(0.001f, high - low); + return 1.0f - min(1.0f, max(0.0f, y)); +} + +// YaRN algorithm based on LlamaYaRNScaledRotaryEmbedding.py from https://github.com/jquesnelle/yarn +// MIT licensed. Copyright (c) 2023 Jeffrey Quesnelle and Bowen Peng. +float2 rope_yarn( + float theta_extrap, float freq_scale, float2 corr_dims, int i0, float ext_factor, float mscale +) { + // Get n-d rotational scaling corrected for extrapolation + float theta_interp = freq_scale * theta_extrap; + float theta = theta_interp; + if (ext_factor != 0.0f) { + float ramp_mix = rope_yarn_ramp(corr_dims.s0, corr_dims.s1, i0) * ext_factor; + theta = theta_interp * (1 - ramp_mix) + theta_extrap * ramp_mix; + + // Get n-d magnitude scaling corrected for interpolation + mscale *= 1.0f + 0.1f * log(1.0f / freq_scale); + } + return (float2)(cos(theta) * mscale, sin(theta) * mscale); +} + +// Apparently solving `n_rot = 2pi * x * base^((2 * max_pos_emb) / n_dims)` for x, we get +// `corr_fac(n_rot) = n_dims * log(max_pos_emb / (n_rot * 2pi)) / (2 * log(base))` +float rope_yarn_corr_factor(int n_dims, int n_ctx_orig, float n_rot, float base) { + return n_dims * log(n_ctx_orig / (n_rot * 2 * M_PI_F)) / (2 * log(base)); +} + +float2 rope_yarn_corr_dims( + int n_dims, int n_ctx_orig, float freq_base, float beta_fast, float beta_slow +) { + // start and end correction dims + return (float2)( + max(0.0f, floor(rope_yarn_corr_factor(n_dims, n_ctx_orig, beta_fast, freq_base))), + min(n_dims - 1.0f, ceil(rope_yarn_corr_factor(n_dims, n_ctx_orig, beta_slow, freq_base))) + ); +} + +kernel void kernel_rope_norm_f32( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * src2, + ulong offset2, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3, + int n_past, + int n_dims, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + src2 = (global float*)((global char*)src2 + offset2); + dst = (global float*)((global char*)dst + offsetd); + + int i3 = get_group_id(2); + int i2 = get_group_id(1); + int i1 = get_group_id(0); + + float2 corr_dims = rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow); + + global int * pos = src1; + + float theta_base = (float) pos[i2]; + float inv_ndims = -1.f/n_dims; + + for (int i0 = 2*get_local_id(0); i0 < ne0; i0 += 2*get_local_size(0)) { + if (i0 < n_dims) { + int ic = i0/2; + + float theta = theta_base * pow(freq_base, inv_ndims*i0); + + float freq_factor = src2 != src0 ? src2[ic] : 1.0f; + + float2 cos_sin_theta = rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor); + + global float * src = (global float *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global float * dst_data = (global float *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + float x0 = src[0]; + float x1 = src[1]; + + dst_data[0] = x0*cos_sin_theta.s0 - x1*cos_sin_theta.s1; + dst_data[1] = x0*cos_sin_theta.s1 + x1*cos_sin_theta.s0; + } else { + global float * src = (global float *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global float * dst_data = (global float *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } + } +} + +kernel void kernel_rope_norm_f16( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * src2, + ulong offset2, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3, + int n_past, + int n_dims, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + src2 = (global float*)((global char*)src2 + offset2); + dst = (global float*)((global char*)dst + offsetd); + + int i3 = get_group_id(2); + int i2 = get_group_id(1); + int i1 = get_group_id(0); + + float2 corr_dims = rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow); + + global int * pos = src1; + + float theta_base = (float) pos[i2]; + float inv_ndims = -1.f/n_dims; + + for (int i0 = 2*get_local_id(0); i0 < ne0; i0 += 2*get_local_size(0)) { + if (i0 < n_dims) { + int ic = i0/2; + + float theta = theta_base * pow(freq_base, inv_ndims*i0); + + float freq_factor = src2 != src0 ? src2[ic] : 1.0f; + + float2 cos_sin_theta = rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor); + + global half * src = (global half *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global half * dst_data = (global half *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + float x0 = src[0]; + float x1 = src[1]; + + dst_data[0] = x0*cos_sin_theta.s0 - x1*cos_sin_theta.s1; + dst_data[1] = x0*cos_sin_theta.s1 + x1*cos_sin_theta.s0; + } else { + global half * src = (global half *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global half * dst_data = (global half *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } + } +} + +kernel void kernel_rope_neox_f32( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * src2, + ulong offset2, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3, + int n_past, + int n_dims, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + src2 = (global float*)((global char*)src2 + offset2); + dst = (global float*)((global char*)dst + offsetd); + + int i3 = get_group_id(2); + int i2 = get_group_id(1); + int i1 = get_group_id(0); + + float2 corr_dims = rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow); + + global int * pos = src1; + + float theta_base = (float) pos[i2]; + float inv_ndims = -1.f/n_dims; + + for (int i0 = 2*get_local_id(0); i0 < ne0; i0 += 2*get_local_size(0)) { + if (i0 < n_dims) { + int ic = i0/2; + + const float theta = theta_base * pow(freq_base, inv_ndims*i0); + + const float freq_factor = src2 != src0 ? src2[ic] : 1.0f; + + float2 cos_sin_theta = rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor); + + global float * src = (global float *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + global float * dst_data = (global float *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = src[0]; + const float x1 = src[n_dims/2]; + + dst_data[0] = x0*cos_sin_theta.s0 - x1*cos_sin_theta.s1; + dst_data[n_dims/2] = x0*cos_sin_theta.s1 + x1*cos_sin_theta.s0; + } else { + global float * const src = (global float *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global float * dst_data = (global float *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } + } +} + +kernel void kernel_rope_neox_f16( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * src2, + ulong offset2, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3, + int n_past, + int n_dims, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + src2 = (global float*)((global char*)src2 + offset2); + dst = (global float*)((global char*)dst + offsetd); + + int i3 = get_group_id(2); + int i2 = get_group_id(1); + int i1 = get_group_id(0); + + float2 corr_dims = rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow); + + global int * pos = src1; + + float theta_base = (float) pos[i2]; + float inv_ndims = -1.f/n_dims; + + for (int i0 = 2*get_local_id(0); i0 < ne0; i0 += 2*get_local_size(0)) { + if (i0 < n_dims) { + int ic = i0/2; + + const float theta = theta_base * pow(freq_base, inv_ndims*i0); + + const float freq_factor = src2 != src0 ? src2[ic] : 1.0f; + + float2 cos_sin_theta = rope_yarn(theta/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor); + + global half * src = (global half *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + global half * dst_data = (global half *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = src[0]; + const float x1 = src[n_dims/2]; + + dst_data[0] = x0*cos_sin_theta.s0 - x1*cos_sin_theta.s1; + dst_data[n_dims/2] = x0*cos_sin_theta.s1 + x1*cos_sin_theta.s0; + } else { + global half * const src = (global half *)((global char *) src0 + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + global half * dst_data = (global half *)((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } + } +} + +//------------------------------------------------------------------------------ +// cpy +//------------------------------------------------------------------------------ + +kernel void kernel_cpy_f16_f16( + global half * src0, + ulong offset0, + global half * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + src0 = (global half*)((global char*)src0 + offset0); + dst = (global half*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + + int i3 = n / (ne2*ne1*ne0); + int i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0); + int i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0; + int i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0); + + global half * dst_data = (global half *) ((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + global const half * src = (global half *)((global char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00); + dst_data[i00] = src[0]; + } +} + +kernel void kernel_cpy_f16_f32( + global half * src0, + ulong offset0, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + + src0 = (global half*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + + int i3 = n / (ne2*ne1*ne0); + int i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0); + int i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0; + int i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0); + + global float * dst_data = (global float *) ((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + global half * src = (global half *)((global char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00); + dst_data[i00] = src[0]; + } +} + +kernel void kernel_cpy_f32_f16( + global float * src0, + ulong offset0, + global half * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global half*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + + int i3 = n / (ne2*ne1*ne0); + int i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0); + int i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0; + int i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0); + + global half * dst_data = (global half *) ((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + global const float * src = (global float *)((global char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00); + + dst_data[i00] = src[0]; + } +} + +kernel void kernel_cpy_f32_f32( + global float * src0, + ulong offset0, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne03, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne0, + int ne1, + int ne2, + int ne3, + ulong nb0, + ulong nb1, + ulong nb2, + ulong nb3 +) { + src0 = (global float*)((global char*)src0 + offset0); + dst = (global float*)((global char*)dst + offsetd); + + int i03 = get_group_id(2); + int i02 = get_group_id(1); + int i01 = get_group_id(0); + + int n = i03*ne02*ne01*ne00 + i02*ne01*ne00 + i01*ne00; + + int i3 = n / (ne2*ne1*ne0); + int i2 = (n - i3*ne2*ne1*ne0) / (ne1*ne0); + int i1 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0) / ne0; + int i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0); + + global float * dst_data = (global float *) ((global char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + + for (int i00 = get_local_id(0); i00 < ne00; i00 += get_local_size(0)) { + global const float * src = (global float *)((global char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00); + + dst_data[i00] = src[0]; + } +} + +//------------------------------------------------------------------------------ +// get_rows +//------------------------------------------------------------------------------ +kernel void kernel_get_rows_f32( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + ulong nb01, + ulong nb02, + int ne10, + ulong nb10, + ulong nb11, + ulong nb1, + ulong nb2 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int i10 = get_group_id(0); + int i11 = get_group_id(1); + + int r = ((global int *) ((global char *) src1 + i11*nb11 + i10*nb10))[0]; + + int i02 = i11; + + for (int ind = get_local_id(0); ind < ne00; ind += get_local_size(0)) { + ((global float *) ((global char *) dst + i11*nb2 + i10*nb1))[ind] = + ((global float *) ((global char *) src0 + r*nb01 + i02*nb02))[ind]; + } +} + +kernel void kernel_get_rows_f16( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + ulong nb01, + ulong nb02, + int ne10, + ulong nb10, + ulong nb11, + ulong nb1, + ulong nb2 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int i10 = get_group_id(0); + int i11 = get_group_id(1); + + int r = ((global int32_t *) ((global char *) src1 + i11*nb11 + i10*nb10))[0]; + + int i02 = i11; + + for (int ind = get_local_id(0); ind < ne00; ind += get_local_size(0)) { + ((global float *) ((global char *) dst + i11*nb2 + i10*nb1))[ind] = + ((global half *) ((global char *) src0 + r*nb01 + i02*nb02))[ind]; + } +} + +kernel void kernel_get_rows_q4_0( + global void * src0, + ulong offset0, + global int * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + ulong nb01, + ulong nb02, + int ne10, + ulong nb10, + ulong nb11, + ulong nb1, + ulong nb2 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global int*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + const int NL = 2; + + int i10 = get_group_id(0); + int i11 = get_group_id(1); + + int r = ((global int32_t *) ((global char *) src1 + i11*nb11 + i10*nb10))[0]; + + int i02 = i11; + + for (int ind = get_local_id(0); ind < ne00/16; ind += get_local_size(0)) { + float16 temp; + dequantize_q4_0_f32( + ((global struct block_q4_0 *) ((global char *) src0 + r*nb01 + i02*nb02)) + ind/NL, ind%NL, &temp); + *(((global float16 *) ((global char *) dst + i11*nb2 + i10*nb1)) + ind) = temp; + } +} + +//------------------------------------------------------------------------------ +// mul_mat_f32_f32 +//------------------------------------------------------------------------------ +#define N_F32_F32 4 + +kernel void kernel_mul_mat_f32_f32( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global char*)((global char*)src0 + offset0); + src1 = (global char*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int r0 = get_group_id(0); + int rb = get_group_id(1)*N_F32_F32; + int im = get_group_id(2); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb03; + + global float * x = (global float *) (src0 + offset_src0); + + if (ne00 < 128) { + for (int row = 0; row < N_F32_F32; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global float * y = (global float *) (src1 + offset_src1); + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00; i += get_max_sub_group_size()) { + sumf += (float) x[i] * (float) y[i]; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } else { + global float4 * x4 = (global float4 *)x; + for (int row = 0; row < N_F32_F32; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global float * y = (global float *) (src1 + offset_src1); + global float4 * y4 = (global float4 *) y; + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00/4; i += get_max_sub_group_size()) { + sumf += (float) x4[i].s0 * y4[i].s0; + sumf += (float) x4[i].s1 * y4[i].s1; + sumf += (float) x4[i].s2 * y4[i].s2; + sumf += (float) x4[i].s3 * y4[i].s3; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + for (int i = 4*(ne00/4); i < ne00; ++i) { + all_sum += (float) x[i] * y[i]; + } + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } +} + +//------------------------------------------------------------------------------ +// mul_mat_f16_f16 +//------------------------------------------------------------------------------ +#define N_F16_F16 4 + +kernel void kernel_mul_mat_f16_f16( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int r2, + int r3) +{ + src0 = (global char*)((global char*)src0 + offset0); + src1 = (global char*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int r0 = get_group_id(0); + int rb = get_group_id(1)*N_F16_F16; + int im = get_group_id(2); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb03; + + global half * x = (global half *) (src0 + offset_src0); + + if (ne00 < 128) { + for (int row = 0; row < N_F16_F16; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global half * y = (global half *) (src1 + offset_src1); + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00; i += get_max_sub_group_size()) { + sumf += (half) x[i] * (half) y[i]; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } else { + global half4 * x4 = (global half4 *)x; + for (int row = 0; row < N_F16_F16; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global half * y = (global half *) (src1 + offset_src1); + global half4 * y4 = (global half4 *) y; + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00/4; i += get_max_sub_group_size()) { + sumf += (half) x4[i].s0 * y4[i].s0; + sumf += (half) x4[i].s1 * y4[i].s1; + sumf += (half) x4[i].s2 * y4[i].s2; + sumf += (half) x4[i].s3 * y4[i].s3; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + for (int i = 4*(ne00/4); i < ne00; ++i) { + all_sum += (half) x[i] * y[i]; + } + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } +} + +//------------------------------------------------------------------------------ +// mul_mat_f16_f32_1row +//------------------------------------------------------------------------------ +kernel void kernel_mul_mat_f16_f32_1row( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global char*)((global char*)src0 + offset0); + src1 = (global char*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb03; + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global half * x = (global half *) (src0 + offset_src0); + global float * y = (global float *) (src1 + offset_src1); + + float sumf = 0; + if (ne00 < 128) { + for (int i = get_sub_group_local_id(); i < ne00; i += get_max_sub_group_size()) { + sumf += (float) x[i] * (float) y[i]; + } + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } else { + global half4 * x4 = (global half4 *) x; + global float4 * y4 = (global float4 *) y; + for (int i = get_sub_group_local_id(); i < ne00/4; i += get_max_sub_group_size()) { + sumf += (float) x4[i].s0 * y4[i].s0; + sumf += (float) x4[i].s1 * y4[i].s1; + sumf += (float) x4[i].s2 * y4[i].s2; + sumf += (float) x4[i].s3 * y4[i].s3; + } + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + for (int i = 4*(ne00/4); i < ne00; ++i) { + all_sum += (float) x[i] * y[i]; + } + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + +} + +//------------------------------------------------------------------------------ +// mul_mat_f16_f32 +//------------------------------------------------------------------------------ +#define N_F16_F32 4 + +#ifdef ADRENO_GPU +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_f16_f32( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global char*)((global char*)src0 + offset0); + src1 = (global char*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int r0 = get_group_id(0); + int rb = get_group_id(1)*N_F16_F32; + int im = get_group_id(2); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb03; + + global half * x = (global half *) (src0 + offset_src0); + + if (ne00 < 128) { + for (int row = 0; row < N_F16_F32; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global float * y = (global float *) (src1 + offset_src1); + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00; i += get_max_sub_group_size()) { + sumf += convert_float(x[i]) * y[i]; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } else { + global half4 * x4 = (global half4 *)x; + for (int row = 0; row < N_F16_F32; ++row) { + int r1 = rb + row; + if (r1 >= ne11) { + break; + } + + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global float * y = (global float *) (src1 + offset_src1); + global float4 * y4 = (global float4 *) y; + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00/4; i += get_max_sub_group_size()) { + sumf += convert_float(x4[i].s0) * y4[i].s0; + sumf += convert_float(x4[i].s1) * y4[i].s1; + sumf += convert_float(x4[i].s2) * y4[i].s2; + sumf += convert_float(x4[i].s3) * y4[i].s3; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + for (int i = 4*(ne00/4); i < ne00; ++i) { + all_sum += (float) x[i] * y[i]; + } + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } + } +} + +//------------------------------------------------------------------------------ +// mul_mat_f16_f32_l4 +//------------------------------------------------------------------------------ +// Assumes row size (ne00) is a multiple of 4 +#ifdef ADRENO_GPU +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_f16_f32_l4( + global char * src0, + ulong offset0, + global char * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + ulong nb00, + ulong nb01, + ulong nb02, + ulong nb03, + int ne10, + int ne11, + int ne12, + ulong nb10, + ulong nb11, + ulong nb12, + ulong nb13, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global char*)((global char*)src0 + offset0); + src1 = (global char*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + int nrows = ne11; + int r0 = get_group_id(0); + int im = get_group_id(2); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = r0*nb01 + (i12/r2)*nb02 + (i13/r3)*nb03; + + global half4 * x4 = (global half4 *) (src0 + offset_src0); + + for (int r1 = 0; r1 < nrows; ++r1) { + ulong offset_src1 = r1*nb11 + (i12 )*nb12 + (i13 )*nb13; + + global float4 * y4 = (global float4 *) (src1 + offset_src1); + + float sumf = 0; + for (int i = get_sub_group_local_id(); i < ne00/4; i += get_max_sub_group_size()) { + sumf += convert_float(x4[i].s0) * y4[i].s0; + sumf += convert_float(x4[i].s1) * y4[i].s1; + sumf += convert_float(x4[i].s2) * y4[i].s2; + sumf += convert_float(x4[i].s3) * y4[i].s3; + } + + float all_sum = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[im*ne1*ne0 + r1*ne0 + r0] = all_sum; + } + } +} + +//------------------------------------------------------------------------------ +// mul_vec_q_n_f32 +//------------------------------------------------------------------------------ +// function for calculate inner product between half a q4_0 block and 16 floats (yl), sumy is SUM(yl[i]) +// il indicates where the q4 quants begin (0 or QK4_0/4) +// we assume that the yl's have been multiplied with the appropriate scale factor +// that corresponds to the missing bit shifts (1, 1/16, 1/256, 1/4096) +inline float block_q_4_0_dot_y( + global struct block_q4_0 * qb_curr, + float sumy, + private float * yl, + int il +) { + float d = qb_curr->d; + float2 acc = 0.f; + global ushort * qs = ((global ushort *)qb_curr + 1 + il/2); + for (int i = 0; i < 8; i+=2) { + acc.s0 += yl[i + 0] * (qs[i / 2] & 0x000F) + + yl[i + 1] * (qs[i / 2] & 0x0F00); + acc.s1 += yl[i + 8] * (qs[i / 2] & 0x00F0) + + yl[i + 9] * (qs[i / 2] & 0xF000); + } + return d * (sumy * -8.f + acc.s0 + acc.s1); +} + +#ifdef INTEL_GPU +#define N_DST 4 // each SIMD group works on 4 rows +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 16 +#elif defined (ADRENO_GPU) +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +inline void mul_vec_q_n_f32( + global void * src0, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + + const ulong nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is essenatially the linear global + // id of a SIMD group in the grid. + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset0 = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + + global struct block_q4_0 * x = (global struct block_q4_0 *) src0 + offset0; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float yl[16]; // src1 vector cache + float sumf[N_DST]={0.f}; + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix * QK4_0 + il; + + // each thread in a SIMD group deals with half a block. + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0; + for (int i = 0; i < 8; i += 2) { + sumy += yb[i] + yb[i+1]; + yl[i+0] = yb[i+ 0]; + yl[i+1] = yb[i+ 1]/256.f; + sumy += yb[i+16] + yb[i+17]; + yl[i+8] = yb[i+16]/16.f; + yl[i+9] = yb[i+17]/4096.f; + } + + for (int row = 0; row < N_DST; row++) { + sumf[row] += block_q_4_0_dot_y(x+ib+row*nb, sumy, yl, il); + } + + // One thread in a SIMD group (i.e., subgroup) handles a half block, + // hence then entire SIMD group handles SIMDWIDTH/2 blocks. + // y points to the activation matrix (of type float). Therefore for + // one thread, the # of blocks y should advance is SIMDWIDTH/2 (because + // SIMDWIDTH/2 blocks are processed by a SIMD group) - in terms of + // floats, it is QK4_0 * (SIMDWIDTH/2), where QK4_0 is the block size. + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + // The above does not work for Adreno - it produces incorrect results for + // row = 1, 2, 3 and only row = 0 gives the correct result. + // If N_DST is changed, the below array must be initialized accordingly. + // This also seems to perform better on Intel. + float tot[N_DST] = { + sub_group_reduce_add(sumf[0]), sub_group_reduce_add(sumf[1]), + sub_group_reduce_add(sumf[2]), sub_group_reduce_add(sumf[3])}; + for (int row = 0; row < N_DST; ++row) { + if (get_sub_group_local_id() == 0 && first_row + row < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + row] = tot[row]; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32( + global void * src0, + ulong offset0, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_vec_q_n_f32(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} + +// +// This variant unrolls the loops and uses vector types instead of pointers. +// It improves performance on Adreno but not so much on Intel. +// +inline float block_q_4_0_dot_y_v( + global struct block_q4_0 * qb_curr, + float sumy, + float16 yl, + int il +) { + float d = qb_curr->d; + float acc = 0.f; + global ushort * qs = ((global ushort *)qb_curr + 1 + il/2); + + acc += yl.s0 * (qs[0] & 0x000F); + acc += yl.s1 * (qs[0] & 0x0F00); + acc += yl.s8 * (qs[0] & 0x00F0); + acc += yl.s9 * (qs[0] & 0xF000); + + acc += yl.s2 * (qs[1] & 0x000F); + acc += yl.s3 * (qs[1] & 0x0F00); + acc += yl.sa * (qs[1] & 0x00F0); + acc += yl.sb * (qs[1] & 0xF000); + + acc += yl.s4 * (qs[2] & 0x000F); + acc += yl.s5 * (qs[2] & 0x0F00); + acc += yl.sc * (qs[2] & 0x00F0); + acc += yl.sd * (qs[2] & 0xF000); + + acc += yl.s6 * (qs[3] & 0x000F); + acc += yl.s7 * (qs[3] & 0x0F00); + acc += yl.se * (qs[3] & 0x00F0); + acc += yl.sf * (qs[3] & 0xF000); + + return d * (sumy * -8.f + acc); +} + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 4 // each SIMD group works on 4 rows +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 16 +#elif defined (ADRENO_GPU) +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +inline void mul_vec_q_n_f32_v( + global void * src0, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + const ulong nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is essenatially the linear global + // id of a SIMD group in the grid. + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset0 = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + + global struct block_q4_0 * x = (global struct block_q4_0 *) src0 + offset0; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float16 yl; // src1 vector cache + float4 sumf = (float4)(0.f, 0.f, 0.f, 0.f); + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix * QK4_0 + il; + + // each thread in a SIMD group deals with half a block. + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0; + + sumy += yb[0]; + sumy += yb[1]; + sumy += yb[2]; + sumy += yb[3]; + sumy += yb[4]; + sumy += yb[5]; + sumy += yb[6]; + sumy += yb[7]; + + sumy += yb[16]; + sumy += yb[17]; + sumy += yb[18]; + sumy += yb[19]; + sumy += yb[20]; + sumy += yb[21]; + sumy += yb[22]; + sumy += yb[23]; + + + yl.s0 = yb[0]; + yl.s1 = yb[1]/256.f; + + yl.s2 = yb[2]; + yl.s3 = yb[3]/256.f; + + yl.s4 = yb[4]; + yl.s5 = yb[5]/256.f; + + yl.s6 = yb[6]; + yl.s7 = yb[7]/256.f; + + yl.s8 = yb[16]/16.f; + yl.s9 = yb[17]/4096.f; + + yl.sa = yb[18]/16.f; + yl.sb = yb[19]/4096.f; + + yl.sc = yb[20]/16.f; + yl.sd = yb[21]/4096.f; + + yl.se = yb[22]/16.f; + yl.sf = yb[23]/4096.f; + + sumf.s0 += block_q_4_0_dot_y_v(x+ib+0*nb, sumy, yl, il); + sumf.s1 += block_q_4_0_dot_y_v(x+ib+1*nb, sumy, yl, il); + sumf.s2 += block_q_4_0_dot_y_v(x+ib+2*nb, sumy, yl, il); + sumf.s3 += block_q_4_0_dot_y_v(x+ib+3*nb, sumy, yl, il); + + // One thread in a SIMD group (i.e., subgroup) handles a half block, + // hence then entire SIMD group handles SIMDWIDTH/2 blocks. + // y points to the activation matrix (of type float). Therefore for + // one thread, the # of blocks y should advance is SIMDWIDTH/2 (because + // SIMDWIDTH/2 blocks are processed by a SIMD group) - in terms of + // floats, it is QK4_0 * (SIMDWIDTH/2), where QK4_0 is the block size. + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + // The above does not work for Adreno - it produces incorrect results for + // row = 1, 2, 3 and only row = 0 gives the correct result. + // If N_DST is changed, the below array must be initialized accordingly. + // This also seems to perform better on Intel. + float4 tot = (float4)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1), + sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3) + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_v( + global void * src0, + ulong offset0, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_vec_q_n_f32_v(src0, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} + +//------------------------------------------------------------------------------ +// kernel_convert_block_q4_0 +// Convert the block_q4_0 format to 2 separate arrays (AOS -> SOA). +// This kernel does not deshuffle the bits. +//------------------------------------------------------------------------------ +kernel void kernel_convert_block_q4_0( + global struct block_q4_0 * src0, + global uchar * dst_q, + global half * dst_d +) { + global struct block_q4_0 * b = (global struct block_q4_0 *) src0 + get_global_id(0); + global uchar * q = (global uchar *) dst_q + QK4_0/2*get_global_id(0); + global half * d = (global half *) dst_d + get_global_id(0); + + *d = b->d; + + for (int i = 0; i < QK4_0/2; ++i) { + q[i] = b->qs[i]; + } +} + +kernel void kernel_restore_block_q4_0( + global uchar * src_q, + global half * src_d, + global struct block_q4_0 * dst +) { + global struct block_q4_0 * b = (global struct block_q4_0 *) dst + get_global_id(0); + global uchar * q = (global uchar *) src_q + QK4_0/2*get_global_id(0); + global half * d = (global half *) src_d + get_global_id(0); + + b->d = *d; + for (int i = 0; i < QK4_0/2; ++i) { + b->qs[i] = q[i]; + } +} + +//------------------------------------------------------------------------------ +// mul_vec_q_n_f32_flat +// +// This variation uses flat arrays (struct of arrays, SOA) representation for +// quant tensors. +//------------------------------------------------------------------------------ + +// This function requires the original shuffled weights. +// As a reminder, the original weights are shuffled so that (q[0], q[16]) are +// packed together in a byte, so are (q[1], q[17]) and so on. +inline float block_q_4_0_dot_y_flat( + global uchar * x, + global half * dh, + float sumy, + float16 yl, + int il +) { + float d = *dh; + global ushort * qs = ((global ushort *)x + il/2); + float acc = 0.f; + + acc += yl.s0 * (qs[0] & 0x000F); + acc += yl.s1 * (qs[0] & 0x0F00); + acc += yl.s8 * (qs[0] & 0x00F0); + acc += yl.s9 * (qs[0] & 0xF000); + + acc += yl.s2 * (qs[1] & 0x000F); + acc += yl.s3 * (qs[1] & 0x0F00); + acc += yl.sa * (qs[1] & 0x00F0); + acc += yl.sb * (qs[1] & 0xF000); + + acc += yl.s4 * (qs[2] & 0x000F); + acc += yl.s5 * (qs[2] & 0x0F00); + acc += yl.sc * (qs[2] & 0x00F0); + acc += yl.sd * (qs[2] & 0xF000); + + acc += yl.s6 * (qs[3] & 0x000F); + acc += yl.s7 * (qs[3] & 0x0F00); + acc += yl.se * (qs[3] & 0x00F0); + acc += yl.sf * (qs[3] & 0xF000); + + return d * (sumy * -8.f + acc); +} + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 4 // each SIMD group works on 4 rows +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 32 +#elif defined (ADRENO_GPU) +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +inline void mul_vec_q_n_f32_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + const ulong nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is the linear global id of + // a SIMD group in the grid. Each SIMD group produces N_DST values in the + // result, hence uses nb blocks, i.e., the offset becomes first_row*nb. + // Currently with llama2 7B, im is always 0. + // TODO: how to handle im/gqa*(nb*ne0)? + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = (first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02)) * QK4_0/2; + + global uchar * x = (global uchar *) src0_q + offset0_q; + global half * d = (global half *) src0_d + offset0_d; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float16 yl; + float4 sumf = (float4)(0.f, 0.f, 0.f, 0.f); + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix*QK4_0 + il; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0.f; + + sumy += yb[0]; + sumy += yb[1]; + sumy += yb[2]; + sumy += yb[3]; + sumy += yb[4]; + sumy += yb[5]; + sumy += yb[6]; + sumy += yb[7]; + + sumy += yb[16]; + sumy += yb[17]; + sumy += yb[18]; + sumy += yb[19]; + sumy += yb[20]; + sumy += yb[21]; + sumy += yb[22]; + sumy += yb[23]; + + yl.s0 = yb[0]; + yl.s1 = yb[1]/256.f; + + yl.s2 = yb[2]; + yl.s3 = yb[3]/256.f; + + yl.s4 = yb[4]; + yl.s5 = yb[5]/256.f; + + yl.s6 = yb[6]; + yl.s7 = yb[7]/256.f; + + yl.s8 = yb[16]/16.f; + yl.s9 = yb[17]/4096.f; + + yl.sa = yb[18]/16.f; + yl.sb = yb[19]/4096.f; + + yl.sc = yb[20]/16.f; + yl.sd = yb[21]/4096.f; + + yl.se = yb[22]/16.f; + yl.sf = yb[23]/4096.f; + + sumf.s0 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 0*nb*QK4_0/2, d + ib + 0*nb, sumy, yl, il); + sumf.s1 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 1*nb*QK4_0/2, d + ib + 1*nb, sumy, yl, il); + sumf.s2 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 2*nb*QK4_0/2, d + ib + 2*nb, sumy, yl, il); + sumf.s3 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 3*nb*QK4_0/2, d + ib + 3*nb, sumy, yl, il); + + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + float4 tot = (float4)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1), + sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3) + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_vec_q_n_f32_flat(src0_q, src0_d, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} + +// +// This variant outputs 8 values. +// +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 8 // each SIMD group works on 8 rows +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 32 +#elif defined (ADRENO_GPU) +#define N_DST 8 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +inline void mul_vec_q_n_f32_8x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + const ulong nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is the linear global id of + // a SIMD group in the grid. Each SIMD group produces N_DST values in the + // result, hence uses nb blocks, i.e., the offset becomes first_row*nb. + // Currently with llama2 7B, im is always 0. + // TODO: how to handle im/gqa*(nb*ne0)? + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = (first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02)) * QK4_0/2; + + global uchar * x = (global uchar *) src0_q + offset0_q; + global half * d = (global half *) src0_d + offset0_d; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float16 yl; + float8 sumf = 0.f; + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix*QK4_0 + il; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0.f; + + sumy += yb[0]; + sumy += yb[1]; + sumy += yb[2]; + sumy += yb[3]; + sumy += yb[4]; + sumy += yb[5]; + sumy += yb[6]; + sumy += yb[7]; + + sumy += yb[16]; + sumy += yb[17]; + sumy += yb[18]; + sumy += yb[19]; + sumy += yb[20]; + sumy += yb[21]; + sumy += yb[22]; + sumy += yb[23]; + + yl.s0 = yb[0]; + yl.s1 = yb[1]/256.f; + + yl.s2 = yb[2]; + yl.s3 = yb[3]/256.f; + + yl.s4 = yb[4]; + yl.s5 = yb[5]/256.f; + + yl.s6 = yb[6]; + yl.s7 = yb[7]/256.f; + + yl.s8 = yb[16]/16.f; + yl.s9 = yb[17]/4096.f; + + yl.sa = yb[18]/16.f; + yl.sb = yb[19]/4096.f; + + yl.sc = yb[20]/16.f; + yl.sd = yb[21]/4096.f; + + yl.se = yb[22]/16.f; + yl.sf = yb[23]/4096.f; + + sumf.s0 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 0*nb*QK4_0/2, d + ib + 0*nb, sumy, yl, il); + sumf.s1 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 1*nb*QK4_0/2, d + ib + 1*nb, sumy, yl, il); + sumf.s2 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 2*nb*QK4_0/2, d + ib + 2*nb, sumy, yl, il); + sumf.s3 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 3*nb*QK4_0/2, d + ib + 3*nb, sumy, yl, il); + + sumf.s4 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 4*nb*QK4_0/2, d + ib + 4*nb, sumy, yl, il); + sumf.s5 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 5*nb*QK4_0/2, d + ib + 5*nb, sumy, yl, il); + sumf.s6 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 6*nb*QK4_0/2, d + ib + 6*nb, sumy, yl, il); + sumf.s7 += block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 7*nb*QK4_0/2, d + ib + 7*nb, sumy, yl, il); + + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + float8 tot = (float8)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1), + sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3), + sub_group_reduce_add(sumf.s4), sub_group_reduce_add(sumf.s5), + sub_group_reduce_add(sumf.s6), sub_group_reduce_add(sumf.s7) + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } + + if (first_row + 4 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 4] = tot.s4; + } + if (first_row + 5 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 5] = tot.s5; + } + if (first_row + 6 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 6] = tot.s6; + } + if (first_row + 7 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 7] = tot.s7; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_8x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_vec_q_n_f32_8x_flat(src0_q, src0_d, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_cvt.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_cvt.cl new file mode 100644 index 000000000..e2024332f --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_cvt.cl @@ -0,0 +1,106 @@ +//------------------------------------------------------------------------------ +// This file is contains additional kernels for data conversion. +// These kernels are used when loading the model, so its performance is less +// important. +//------------------------------------------------------------------------------ +#ifdef cl_khr_fp16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#elif defined(cl_amd_fp16) +#pragma OPENCL EXTENSION cl_amd_fp16 : enable +#else +#error "Half precision floating point not supportedby OpenCL implementation on your device." +#endif + +#ifdef cl_khr_subgroups +#pragma OPENCL EXTENSION cl_khr_subgroups : enable +#elif defined(cl_intel_subgroups) +#pragma OPENCL EXTENSION cl_intel_subgroups : enable +#else +#error "Subgroup not supported on your device." +#endif + +#ifdef cl_intel_required_subgroup_size +// Always use subgroup size of 32 on Intel. +#pragma OPENCL EXTENSION cl_intel_required_subgroup_size : enable +#define INTEL_GPU 1 +#define REQD_SUBGROUP_SIZE_16 __attribute__((intel_reqd_sub_group_size(16))) +#define REQD_SUBGROUP_SIZE_32 __attribute__((intel_reqd_sub_group_size(32))) +#elif defined(cl_qcom_reqd_sub_group_size) +// Always use subgroups size of 64 on Adreno. +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable +#define ADRENO_GPU 1 +#define REQD_SUBGROUP_SIZE_64 __attribute__((qcom_reqd_sub_group_size("half"))) +#define REQD_SUBGROUP_SIZE_128 __attribute__((qcom_reqd_sub_group_size("full"))) +#else +// TODO: do not know how to choose subgroup size on other GPUs. +#error "Selecting subgroup size is not supported on your device." +#endif + +#define QK4_0 32 +#define QR4_0 2 +#define QK4_1 32 +#define QR4_1 2 +#define QK5_0 32 +#define QR5_0 2 +#define QK5_1 32 +#define QR5_1 2 +#define QK8_0 32 +#define QR8_0 1 +#define QK_K 256 +#define K_QUANTS_PER_ITERATION 2 + +typedef char int8_t; +typedef uchar uint8_t; +typedef short int16_t; +typedef ushort uint16_t; +typedef int int32_t; +typedef uint uint32_t; + +//------------------------------------------------------------------------------ +// block_q4_0 +//------------------------------------------------------------------------------ +struct block_q4_0 +{ + half d; + uint8_t qs[QK4_0 / 2]; +}; + +//------------------------------------------------------------------------------ +// mul_vec_q_n_f32_flat_noshuffle +// +// This variation uses flat arrays (struct of arrays, SOA) representation for +// quant tensors. It also uses non shuffled bit order for weights. +// +// The shuffled version is kept in the original file because moving it here +// seems to result in worse performance for adreno. +//------------------------------------------------------------------------------ + +kernel void kernel_convert_block_q4_0_noshuffle( + global struct block_q4_0 * src0, + global uchar * dst_q, + global half * dst_d +) { + global struct block_q4_0 * b = (global struct block_q4_0 *) src0 + get_global_id(0); + global uchar * q = (global uchar *) dst_q + QK4_0/2*get_global_id(0); + global half * d = (global half *) dst_d + get_global_id(0); + + *d = b->d; + for (int i = 0; i < QK4_0/4; ++i) { + uchar x0 = b->qs[2*i + 0]; + uchar x1 = b->qs[2*i + 1]; + + q[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4); + q[i + QK4_0/4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0); + +#ifdef ADRENO_GPU + // Workaround for adreno - must have the following printf statement for + // the kernel to work properly. Otherwise it produces incorrect result. + // convert_uchar above also seems necessary. + // Compare against a large number so that it does not print anything. + // get_sub_group_local_id() also works. + if (get_global_id(0) == 65536*4096) { + printf("%04x - %02x\n", *(global ushort*)d, ((x0 & 0xF0) >> 4) | (x1 & 0xF0)); + } +#endif + } +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle.cl new file mode 100644 index 000000000..5e195411d --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle.cl @@ -0,0 +1,265 @@ +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#pragma OPENCL EXTENSION cl_khr_subgroups : enable +#pragma OPENCL EXTENSION cl_qcom_subgroup_uniform_load: enable +#pragma OPENCL EXTENSION cl_qcom_subgroup_constant_load: enable +#pragma OPENCL EXTENSION cl_qcom_extra_vector_types : enable +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable + +// assume +#define QK4_0 32 +#define N_SIMDGROUP 4 + +#define dequantizeBlockAccum_ns_sgbroadcast_1_hi(total_sums, bits4, scale, y) \ + float shared_y; \ + shared_y = sub_group_broadcast(y.s0, 0); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 0); \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 0); \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 0); \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 0); \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 0); \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 0); \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 0); \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s0, 1); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 1); \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 1); \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 1); \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 1); \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 1); \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 1); \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 1); \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_1_lo(total_sums, bits4, scale, y) \ + shared_y = sub_group_broadcast(y.s0, 2); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 2); \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 2); \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 2); \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 2); \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 2); \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 2); \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 2); \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s0, 3); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 3); \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 3); \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 3); \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 3); \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 3); \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 3); \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 3); \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_8_hi(total_sums, bits4, scale, y) \ + float8 shared_y; \ + shared_y = sub_group_broadcast(y, 0); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + shared_y = sub_group_broadcast(y, 1); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_8_lo(total_sums, bits4, scale, y) \ + shared_y = sub_group_broadcast(y, 2); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + shared_y = sub_group_broadcast(y, 3); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + + +__attribute__((qcom_reqd_sub_group_size("full"))) +__kernel void kernel_gemv_noshuffle( + __read_only image1d_buffer_t src0_q, // quantized A + global half2 * src0_d, // A scales + __read_only image1d_buffer_t src1, // B + ulong offset1, // offset to B (0) + global float * dst, // C + ulong offsetd, // offset to C (0) + uint K, // K + int ne01, // M + int ne02, // 1 + int ne10, // K + int ne12, // 1 + int ne0, // M + int ne1, // N + int r2, // 1 + int r3) +{ + uint groupId = get_local_id(1); + uint gid = get_global_id(0); + ushort slid = get_sub_group_local_id(); + + __private uint4 regA; + __private half2 regS; + __private float8 regB; + + __private float2 totalSum = (float2)(0.0f); + + // loop along K in block granularity, skip 4 blocks every iter + for (uint k = groupId; k < (K / QK4_0); k += N_SIMDGROUP) { + regS = src0_d[gid + k * LINE_STRIDE_A]; // each fiber loads scale of two rows + // first 4 fibers in each wave load 8 B values to its private scope + if (slid < 4) { + regB.s0123 = read_imagef(src1, (slid * 2 + k * 8)); + regB.s4567 = read_imagef(src1, (1 + slid * 2 + k * 8)); + } + + // load half weights for two blocks in consecutive rows + regA.s0 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 0)).x; + regA.s1 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 1)).x; + regA.s2 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 2)).x; + regA.s3 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 3)).x; +#ifdef VECTOR_SUB_GROUP_BROADCAT + dequantizeBlockAccum_ns_sgbroadcast_8_hi(totalSum, as_ushort8(regA), regS, regB); +#else + dequantizeBlockAccum_ns_sgbroadcast_1_hi(totalSum, as_ushort8(regA), regS, regB); +#endif // VECTOR_SUB_GROUP_BROADCAT + + regA.s0 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 4)).x; + regA.s1 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 5)).x; + regA.s2 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 6)).x; + regA.s3 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 7)).x; +#ifdef VECTOR_SUB_GROUP_BROADCAT + dequantizeBlockAccum_ns_sgbroadcast_8_lo(totalSum, as_ushort8(regA), regS, regB); +#else + dequantizeBlockAccum_ns_sgbroadcast_1_lo(totalSum, as_ushort8(regA), regS, regB); +#endif // VECTOR_SUB_GROUP_BROADCAT + } + + // reduction in local memory, assumes #wave=4 + __local float2 reduceLM[SIMDGROUP_WIDTH * 3]; + if (groupId == 1) reduceLM[SIMDGROUP_WIDTH * 0 + slid] = totalSum; + if (groupId == 2) reduceLM[SIMDGROUP_WIDTH * 1 + slid] = totalSum; + if (groupId == 3) reduceLM[SIMDGROUP_WIDTH * 2 + slid] = totalSum; + barrier(CLK_LOCAL_MEM_FENCE); + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 0 + slid]; + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 1 + slid]; + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 2 + slid]; + + // 2 outputs per fiber in wave 0 + if (groupId == 0) { + dst = (global float*)((global char*)dst + offsetd); + vstore2(totalSum, 0, &(dst[gid * 2])); + } + +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle_general.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle_general.cl new file mode 100644 index 000000000..5bdd4d067 --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_gemv_noshuffle_general.cl @@ -0,0 +1,271 @@ +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#pragma OPENCL EXTENSION cl_khr_subgroups : enable +#pragma OPENCL EXTENSION cl_qcom_subgroup_uniform_load: enable +#pragma OPENCL EXTENSION cl_qcom_subgroup_constant_load: enable +#pragma OPENCL EXTENSION cl_qcom_extra_vector_types : enable +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable + +// assume +#define QK4_0 32 +#define N_SIMDGROUP 4 + +#define dequantizeBlockAccum_ns_sgbroadcast_1_hi(total_sums, bits4, scale, y) \ + float shared_y; \ + shared_y = sub_group_broadcast(y.s0, 0); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 0); \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 0); \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 0); \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 0); \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 0); \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 0); \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 0); \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s0, 1); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 1); \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 1); \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 1); \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 1); \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 1); \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 1); \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 1); \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_1_lo(total_sums, bits4, scale, y) \ + shared_y = sub_group_broadcast(y.s0, 2); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 2); \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 2); \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 2); \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 2); \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 2); \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 2); \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 2); \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s0, 3); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s1, 3); \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s2, 3); \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s3, 3); \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s4, 3); \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s5, 3); \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s6, 3); \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y; \ + shared_y = sub_group_broadcast(y.s7, 3); \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_8_hi(total_sums, bits4, scale, y) \ + float8 shared_y; \ + shared_y = sub_group_broadcast(y, 0); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + shared_y = sub_group_broadcast(y, 1); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + + +#define dequantizeBlockAccum_ns_sgbroadcast_8_lo(total_sums, bits4, scale, y) \ + shared_y = sub_group_broadcast(y, 2); \ + total_sums.s0 += ((bits4.s0 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s0 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s0 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s0 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s2 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s2 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s2 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s2 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s1 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s1 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s1 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s1 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s3 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s3 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s3 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s3 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + shared_y = sub_group_broadcast(y, 3); \ + total_sums.s0 += ((bits4.s4 & 0x000F) - 8) * scale.s0 * shared_y.s0; \ + total_sums.s0 += (((bits4.s4 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s1; \ + total_sums.s0 += (((bits4.s4 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s2; \ + total_sums.s0 += (((bits4.s4 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s3; \ + total_sums.s0 += ((bits4.s6 & 0x000F) - 8) * scale.s0 * shared_y.s4; \ + total_sums.s0 += (((bits4.s6 & 0x00F0) >> 4) - 8) * scale.s0 * shared_y.s5; \ + total_sums.s0 += (((bits4.s6 & 0x0F00) >> 8) - 8) * scale.s0 * shared_y.s6; \ + total_sums.s0 += (((bits4.s6 & 0xF000) >> 12) - 8) * scale.s0 * shared_y.s7; \ + total_sums.s1 += ((bits4.s5 & 0x000F) - 8) * scale.s1 * shared_y.s0; \ + total_sums.s1 += (((bits4.s5 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s1; \ + total_sums.s1 += (((bits4.s5 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s2; \ + total_sums.s1 += (((bits4.s5 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s3; \ + total_sums.s1 += ((bits4.s7 & 0x000F) - 8) * scale.s1 * shared_y.s4; \ + total_sums.s1 += (((bits4.s7 & 0x00F0) >> 4) - 8) * scale.s1 * shared_y.s5; \ + total_sums.s1 += (((bits4.s7 & 0x0F00) >> 8) - 8) * scale.s1 * shared_y.s6; \ + total_sums.s1 += (((bits4.s7 & 0xF000) >> 12) - 8) * scale.s1 * shared_y.s7; \ + + +__attribute__((qcom_reqd_sub_group_size("full"))) +__kernel void kernel_gemv_noshuffle( + __read_only image1d_buffer_t src0_q, // quantized A + global half2 * src0_d, // A scales + __read_only image1d_buffer_t src1, // B + ulong offset1, // offset to B (0) + global float * dst, // C + ulong offsetd, // offset to C (0) + int ne00, // K + int ne01, // M + int ne02, // 1 + int ne10, // K + int ne12, // 1 + int ne0, // M + int ne1, // N + int r2, // 1 + int r3) +{ + uint groupId = get_local_id(1); + uint gid = get_global_id(0); + ushort slid = get_sub_group_local_id(); + + uint K = ne00; + uint M = ne01; + + uint LINE_STRIDE_A = M / 2; + uint BLOCK_STRIDE_A = N_SIMDGROUP * M; + + __private uint4 regA; + __private half2 regS; + __private float8 regB; + + __private float2 totalSum = (float2)(0.0f); + + // loop along K in block granularity, skip 4 blocks every iter + for (uint k = groupId; k < (K / QK4_0); k += N_SIMDGROUP) { + regS = src0_d[gid + k * LINE_STRIDE_A]; // each fiber loads scale of two rows + // first 4 fibers in each wave load 8 B values to its private scope + if (slid < 4) { + regB.s0123 = read_imagef(src1, (slid * 2 + k * 8)); + regB.s4567 = read_imagef(src1, (1 + slid * 2 + k * 8)); + } + + // load half weights for two blocks in consecutive rows + regA.s0 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 0)).x; + regA.s1 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 1)).x; + regA.s2 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 2)).x; + regA.s3 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 3)).x; +#ifdef VECTOR_SUB_GROUP_BROADCAT + dequantizeBlockAccum_ns_sgbroadcast_8_hi(totalSum, as_ushort8(regA), regS, regB); +#else + dequantizeBlockAccum_ns_sgbroadcast_1_hi(totalSum, as_ushort8(regA), regS, regB); +#endif // VECTOR_SUB_GROUP_BROADCAT + + regA.s0 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 4)).x; + regA.s1 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 5)).x; + regA.s2 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 6)).x; + regA.s3 = read_imageui(src0_q, (gid + k * BLOCK_STRIDE_A + LINE_STRIDE_A * 7)).x; +#ifdef VECTOR_SUB_GROUP_BROADCAT + dequantizeBlockAccum_ns_sgbroadcast_8_lo(totalSum, as_ushort8(regA), regS, regB); +#else + dequantizeBlockAccum_ns_sgbroadcast_1_lo(totalSum, as_ushort8(regA), regS, regB); +#endif // VECTOR_SUB_GROUP_BROADCAT + } + + // reduction in local memory, assumes #wave=4 + __local float2 reduceLM[SIMDGROUP_WIDTH * 3]; + if (groupId == 1) reduceLM[SIMDGROUP_WIDTH * 0 + slid] = totalSum; + if (groupId == 2) reduceLM[SIMDGROUP_WIDTH * 1 + slid] = totalSum; + if (groupId == 3) reduceLM[SIMDGROUP_WIDTH * 2 + slid] = totalSum; + barrier(CLK_LOCAL_MEM_FENCE); + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 0 + slid]; + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 1 + slid]; + if (groupId == 0) totalSum += reduceLM[SIMDGROUP_WIDTH * 2 + slid]; + + // 2 outputs per fiber in wave 0 + if (groupId == 0) { + dst = (global float*)((global char*)dst + offsetd); + vstore2(totalSum, 0, &(dst[gid * 2])); + } + +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_mm.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_mm.cl new file mode 100644 index 000000000..e19e9a2f4 --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_mm.cl @@ -0,0 +1,1225 @@ +//------------------------------------------------------------------------------ +// This file is contains additional mulmat kernels +// (and potentially other kernels). +//------------------------------------------------------------------------------ +#ifdef cl_khr_fp16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#elif defined(cl_amd_fp16) +#pragma OPENCL EXTENSION cl_amd_fp16 : enable +#else +#error "Half precision floating point not supportedby OpenCL implementation on your device." +#endif + +#ifdef cl_khr_subgroups +#pragma OPENCL EXTENSION cl_khr_subgroups : enable +#elif defined(cl_intel_subgroups) +#pragma OPENCL EXTENSION cl_intel_subgroups : enable +#else +#error "Subgroup not supported on your device." +#endif + +#ifdef cl_intel_required_subgroup_size +// Always use subgroup size of 32 on Intel. +#pragma OPENCL EXTENSION cl_intel_required_subgroup_size : enable +#define INTEL_GPU 1 +#define REQD_SUBGROUP_SIZE_16 __attribute__((intel_reqd_sub_group_size(16))) +#define REQD_SUBGROUP_SIZE_32 __attribute__((intel_reqd_sub_group_size(32))) +#elif defined(cl_qcom_reqd_sub_group_size) +// Always use subgroups size of 64 on Adreno. +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable +#define ADRENO_GPU 1 +#define REQD_SUBGROUP_SIZE_64 __attribute__((qcom_reqd_sub_group_size("half"))) +#define REQD_SUBGROUP_SIZE_128 __attribute__((qcom_reqd_sub_group_size("full"))) +#else +// TODO: do not know how to choose subgroup size on other GPUs. +#error "Selecting subgroup size is not supported on your device." +#endif + +#define QK4_0 32 +#define QR4_0 2 +#define QK4_1 32 +#define QR4_1 2 +#define QK5_0 32 +#define QR5_0 2 +#define QK5_1 32 +#define QR5_1 2 +#define QK8_0 32 +#define QR8_0 1 +#define QK_K 256 +#define K_QUANTS_PER_ITERATION 2 + +typedef char int8_t; +typedef uchar uint8_t; +typedef short int16_t; +typedef ushort uint16_t; +typedef int int32_t; +typedef uint uint32_t; + +//------------------------------------------------------------------------------ +// block_q4_0 +//------------------------------------------------------------------------------ +struct block_q4_0 +{ + half d; + uint8_t qs[QK4_0 / 2]; +}; + +//------------------------------------------------------------------------------ +// block_q6_K +//------------------------------------------------------------------------------ +// 6-bit quantization +// weight is represented as x = a * q +// 16 blocks of 16 elements each +// Effectively 6.5625 bits per weight +typedef struct { + uint8_t ql[QK_K/2]; // quants, lower 4 bits + uint8_t qh[QK_K/4]; // quants, upper 2 bits + int8_t scales[QK_K/16]; // scales, quantized with 8 bits + half d; // super-block scale +} block_q6_K; + +//------------------------------------------------------------------------------ +// These are the variant for matmatmul, based on the matvecmul kernel with +// flattened block_q4_0. +//------------------------------------------------------------------------------ + +// Common dot prod. +inline float mm_block_q_4_0_dot_y_flat( + global uchar * x, + global half * dh, + float sumy, + float16 yl, + int il +) { + float d = *dh; + global ushort * qs = ((global ushort *)x + il/2); + float acc = 0.f; + + acc += yl.s0 * (qs[0] & 0x000F); + acc += yl.s1 * (qs[0] & 0x0F00); + acc += yl.s8 * (qs[0] & 0x00F0); + acc += yl.s9 * (qs[0] & 0xF000); + + acc += yl.s2 * (qs[1] & 0x000F); + acc += yl.s3 * (qs[1] & 0x0F00); + acc += yl.sa * (qs[1] & 0x00F0); + acc += yl.sb * (qs[1] & 0xF000); + + acc += yl.s4 * (qs[2] & 0x000F); + acc += yl.s5 * (qs[2] & 0x0F00); + acc += yl.sc * (qs[2] & 0x00F0); + acc += yl.sd * (qs[2] & 0xF000); + + acc += yl.s6 * (qs[3] & 0x000F); + acc += yl.s7 * (qs[3] & 0x0F00); + acc += yl.se * (qs[3] & 0x00F0); + acc += yl.sf * (qs[3] & 0xF000); + + return d * (sumy * -8.f + acc); +} + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 8 // each SIMD group works on 8 rows (in weights matrix) +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 16 +#elif defined (ADRENO_GPU) +#define N_DST 8 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif +// +// This variant performs 1d blocking with 8x output. +// Eeach simdgroup outputs 8 values on `n0` dim (row in the output matrix). +// +inline void mul_mat_q_n_f32_1d_8x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + const int nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is the linear global id of + // a SIMD group in the grid. Each SIMD group produces N_DST values in the + // result, hence uses nb blocks, i.e., the offset becomes first_row*nb. + // Currently with llama2 7B, im is always 0. + // TODO: how to handle im/gqa*(nb*ne0)? + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = (first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02)) * QK4_0/2; + + global uchar * x = (global uchar *) src0_q + offset0_q; + global half * d = (global half *) src0_d + offset0_d; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float16 yl; + float8 sumf = (float8)(0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f); + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix*QK4_0 + il; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0.f; + + sumy += yb[0]; + sumy += yb[1]; + sumy += yb[2]; + sumy += yb[3]; + sumy += yb[4]; + sumy += yb[5]; + sumy += yb[6]; + sumy += yb[7]; + + sumy += yb[16]; + sumy += yb[17]; + sumy += yb[18]; + sumy += yb[19]; + sumy += yb[20]; + sumy += yb[21]; + sumy += yb[22]; + sumy += yb[23]; + + yl.s0 = yb[0]; + yl.s1 = yb[1]/256.f; + + yl.s2 = yb[2]; + yl.s3 = yb[3]/256.f; + + yl.s4 = yb[4]; + yl.s5 = yb[5]/256.f; + + yl.s6 = yb[6]; + yl.s7 = yb[7]/256.f; + + yl.s8 = yb[16]/16.f; + yl.s9 = yb[17]/4096.f; + + yl.sa = yb[18]/16.f; + yl.sb = yb[19]/4096.f; + + yl.sc = yb[20]/16.f; + yl.sd = yb[21]/4096.f; + + yl.se = yb[22]/16.f; + yl.sf = yb[23]/4096.f; + + sumf.s0 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 0*nb*QK4_0/2, d + ib + 0*nb, sumy, yl, il); + sumf.s1 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 1*nb*QK4_0/2, d + ib + 1*nb, sumy, yl, il); + sumf.s2 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 2*nb*QK4_0/2, d + ib + 2*nb, sumy, yl, il); + sumf.s3 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 3*nb*QK4_0/2, d + ib + 3*nb, sumy, yl, il); + + sumf.s4 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 4*nb*QK4_0/2, d + ib + 4*nb, sumy, yl, il); + sumf.s5 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 5*nb*QK4_0/2, d + ib + 5*nb, sumy, yl, il); + sumf.s6 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 6*nb*QK4_0/2, d + ib + 6*nb, sumy, yl, il); + sumf.s7 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 7*nb*QK4_0/2, d + ib + 7*nb, sumy, yl, il); + + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + float8 tot = (float8)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1), + sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3), + sub_group_reduce_add(sumf.s4), sub_group_reduce_add(sumf.s5), + sub_group_reduce_add(sumf.s6), sub_group_reduce_add(sumf.s7) + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } + + if (first_row + 4 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 4] = tot.s4; + } + if (first_row + 5 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 5] = tot.s5; + } + if (first_row + 6 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 6] = tot.s6; + } + if (first_row + 7 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 7] = tot.s7; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_1d_8x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_mat_q_n_f32_1d_8x_flat(src0_q, src0_d, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 16 // each SIMD group works on 8 rows (in weights matrix) +#define N_SIMDGROUP 1 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // assuming SIMD group size is 16 +#elif defined (ADRENO_GPU) +#define N_DST 16 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif +// +// This variant performs 1d blocking with 16x output. +// Eeach simdgroup outputs 16 values on `n0` dim (row in the output matrix). +// +inline void mul_mat_q_n_f32_1d_16x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + global float * dst, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + const int nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + // (r0 * N_SIMDGROUP + get_sub_group_id()) is the linear global id of + // a SIMD group in the grid. Each SIMD group produces N_DST values in the + // result, hence uses nb blocks, i.e., the offset becomes first_row*nb. + // Currently with llama2 7B, im is always 0. + // TODO: how to handle im/gqa*(nb*ne0)? + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = (first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02)) * QK4_0/2; + + global uchar * x = (global uchar *) src0_q + offset0_q; + global half * d = (global half *) src0_d + offset0_d; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float16 yl; + float16 sumf = (float16)(0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f); + + int ix = get_sub_group_local_id()/2; + int il = 8*(get_sub_group_local_id()%2); + + global float * yb = y + ix*QK4_0 + il; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/2) { + float sumy = 0.f; + + sumy += yb[0]; + sumy += yb[1]; + sumy += yb[2]; + sumy += yb[3]; + sumy += yb[4]; + sumy += yb[5]; + sumy += yb[6]; + sumy += yb[7]; + + sumy += yb[16]; + sumy += yb[17]; + sumy += yb[18]; + sumy += yb[19]; + sumy += yb[20]; + sumy += yb[21]; + sumy += yb[22]; + sumy += yb[23]; + + yl.s0 = yb[0]; + yl.s1 = yb[1]/256.f; + + yl.s2 = yb[2]; + yl.s3 = yb[3]/256.f; + + yl.s4 = yb[4]; + yl.s5 = yb[5]/256.f; + + yl.s6 = yb[6]; + yl.s7 = yb[7]/256.f; + + yl.s8 = yb[16]/16.f; + yl.s9 = yb[17]/4096.f; + + yl.sa = yb[18]/16.f; + yl.sb = yb[19]/4096.f; + + yl.sc = yb[20]/16.f; + yl.sd = yb[21]/4096.f; + + yl.se = yb[22]/16.f; + yl.sf = yb[23]/4096.f; + + sumf.s0 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 0*nb*QK4_0/2, d + ib + 0*nb, sumy, yl, il); + sumf.s1 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 1*nb*QK4_0/2, d + ib + 1*nb, sumy, yl, il); + sumf.s2 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 2*nb*QK4_0/2, d + ib + 2*nb, sumy, yl, il); + sumf.s3 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 3*nb*QK4_0/2, d + ib + 3*nb, sumy, yl, il); + + sumf.s4 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 4*nb*QK4_0/2, d + ib + 4*nb, sumy, yl, il); + sumf.s5 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 5*nb*QK4_0/2, d + ib + 5*nb, sumy, yl, il); + sumf.s6 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 6*nb*QK4_0/2, d + ib + 6*nb, sumy, yl, il); + sumf.s7 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 7*nb*QK4_0/2, d + ib + 7*nb, sumy, yl, il); + + sumf.s8 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 8*nb*QK4_0/2, d + ib + 8*nb, sumy, yl, il); + sumf.s9 += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 9*nb*QK4_0/2, d + ib + 9*nb, sumy, yl, il); + sumf.sa += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 10*nb*QK4_0/2, d + ib + 10*nb, sumy, yl, il); + sumf.sb += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 11*nb*QK4_0/2, d + ib + 11*nb, sumy, yl, il); + + sumf.sc += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 12*nb*QK4_0/2, d + ib + 12*nb, sumy, yl, il); + sumf.sd += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 13*nb*QK4_0/2, d + ib + 13*nb, sumy, yl, il); + sumf.se += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 14*nb*QK4_0/2, d + ib + 14*nb, sumy, yl, il); + sumf.sf += mm_block_q_4_0_dot_y_flat(x + ib*QK4_0/2 + 15*nb*QK4_0/2, d + ib + 15*nb, sumy, yl, il); + + yb += QK4_0 * (N_SIMDWIDTH/2); + } + + float16 tot = (float16)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1), + sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3), + sub_group_reduce_add(sumf.s4), sub_group_reduce_add(sumf.s5), + sub_group_reduce_add(sumf.s6), sub_group_reduce_add(sumf.s7), + + sub_group_reduce_add(sumf.s8), sub_group_reduce_add(sumf.s9), + sub_group_reduce_add(sumf.sa), sub_group_reduce_add(sumf.sb), + sub_group_reduce_add(sumf.sc), sub_group_reduce_add(sumf.sd), + sub_group_reduce_add(sumf.se), sub_group_reduce_add(sumf.sf) + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } + + if (first_row + 4 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 4] = tot.s4; + } + if (first_row + 5 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 5] = tot.s5; + } + if (first_row + 6 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 6] = tot.s6; + } + if (first_row + 7 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 7] = tot.s7; + } + + if (first_row + 8 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 8] = tot.s8; + } + if (first_row + 9 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 9] = tot.s9; + } + if (first_row + 10 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 10] = tot.sa; + } + if (first_row + 11 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 11] = tot.sb; + } + + if (first_row + 12 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 12] = tot.sc; + } + if (first_row + 13 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 13] = tot.sd; + } + if (first_row + 14 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 14] = tot.se; + } + if (first_row + 15 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 15] = tot.sf; + } + } +} + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_1d_16x_flat( + global uchar * src0_q, + global half * src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + mul_mat_q_n_f32_1d_16x_flat(src0_q, src0_d, src1, dst, ne00, ne01, ne02, ne10, ne12, ne0, ne1, r2, r3); +} + +//------------------------------------------------------------------------------ +// kernel_mul_mat_q4_0_f32_flat_v0 +//------------------------------------------------------------------------------ +inline float block_q_4_0_dot_y_flat_v2( + half x, + half d, + float sumy, + float4 yl +) { + uchar2 q = as_uchar2(x); + float acc = 0.0f; + + acc += (q.s0 & 0x0F) * yl.s0; + acc += (q.s1 & 0x0F) * yl.s1; + + acc += (q.s0 & 0xF0) * yl.s2; + acc += (q.s1 & 0xF0) * yl.s3; + + return d * (sumy * -8.f + acc);; +} + +inline float block_q_4_0_dot_y_flat_v4( + float x, + half d, + float sumy, + float8 yl +) { + uchar4 q = as_uchar4(x); + float acc = 0.0f; + + acc += (q.s0 & 0x0F) * yl.s0; + acc += (q.s1 & 0x0F) * yl.s1; + acc += (q.s2 & 0x0F) * yl.s2; + acc += (q.s3 & 0x0F) * yl.s3; + + acc += (q.s0 & 0xF0) * yl.s4; + acc += (q.s1 & 0xF0) * yl.s5; + acc += (q.s2 & 0xF0) * yl.s6; + acc += (q.s3 & 0xF0) * yl.s7; + + return d * (sumy * -8.f + acc);; +} + +inline float block_q_4_0_dot_y_flat_v8( + float2 x, + half d, + float sumy, + float16 yl +) { + uchar8 q = as_uchar8(x); + float acc = 0.0f; + + acc += (q.s0 & 0x0F) * yl.s0; + acc += (q.s1 & 0x0F) * yl.s1; + acc += (q.s2 & 0x0F) * yl.s2; + acc += (q.s3 & 0x0F) * yl.s3; + acc += (q.s4 & 0x0F) * yl.s4; + acc += (q.s5 & 0x0F) * yl.s5; + acc += (q.s6 & 0x0F) * yl.s6; + acc += (q.s7 & 0x0F) * yl.s7; + + acc += (q.s0 & 0xF0) * yl.s8; + acc += (q.s1 & 0xF0) * yl.s9; + acc += (q.s2 & 0xF0) * yl.sa; + acc += (q.s3 & 0xF0) * yl.sb; + acc += (q.s4 & 0xF0) * yl.sc; + acc += (q.s5 & 0xF0) * yl.sd; + acc += (q.s6 & 0xF0) * yl.se; + acc += (q.s7 & 0xF0) * yl.sf; + + return d * (sumy * -8.f + acc);; +} + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define THREADS_PER_BLK 4 // Number of threads per block, or each thread process 1/THREADS_PER_BLK of a block +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 16 +#elif defined (ADRENO_GPU) +#define THREADS_PER_BLK 4 +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +#if THREADS_PER_BLK == 2 // Each thread processes 1/2 block +# define ACT_TY float16 +# define Q_BLK_LD_TY float2 +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v8 +#elif THREADS_PER_BLK == 4 // Each thread processes 1/4 block +# define ACT_TY float8 +# define Q_BLK_LD_TY float +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v4 +#elif THREADS_PER_BLK == 8 // Each thread processes 1/8 block +# define ACT_TY float4 +# define Q_BLK_LD_TY half +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v2 +#endif + +#define BTYES_PER_THREAD_IN_BLK (QK4_0/2/THREADS_PER_BLK) + +#if N_DST == 2 +# define SUM_TY float2 +#elif N_DST == 4 +# define SUM_TY float4 +#elif N_DST == 8 +# define SUM_TY float8 +#elif N_DST == 16 +# define SUM_TY float16 +#endif + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_flat_v0( + global uchar * src0_q, + global half * src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + const int nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = (first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02)) * QK4_0/2; + + global uchar * x = (global uchar *) src0_q + offset0_q; + global half * d = (global half *) src0_d + offset0_d; + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + int ix = get_sub_group_local_id()/THREADS_PER_BLK; + int il = get_sub_group_local_id()%THREADS_PER_BLK; + + global float * yb = y + ix*QK4_0 + BTYES_PER_THREAD_IN_BLK*il; + + // Registers for caching activation + ACT_TY yl = 0.f; + + // Registers for caching quants + Q_BLK_LD_TY q_blk_0 = 0, q_blk_1 = 0; +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + Q_BLK_LD_TY q_blk_2 = 0, q_blk_3 = 0; +#endif +#if N_DST == 8 || N_DST == 16 + Q_BLK_LD_TY q_blk_4 = 0, q_blk_5 = 0, q_blk_6 = 0, q_blk_7 = 0; +#endif + + // Partial sum + SUM_TY sumf = 0.f; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/THREADS_PER_BLK) { + float sumy = 0.f; + + q_blk_0 = *(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 0*nb*QK4_0/2); + q_blk_1 = *(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 1*nb*QK4_0/2); +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + q_blk_2 = *(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 2*nb*QK4_0/2); + q_blk_3 = *(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 3*nb*QK4_0/2); +#endif +#if N_DST == 8 || N_DST == 16 + q_blk_4 = (*(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 4*nb*QK4_0/2)); + q_blk_5 = (*(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 5*nb*QK4_0/2)); + q_blk_6 = (*(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 6*nb*QK4_0/2)); + q_blk_7 = (*(global Q_BLK_LD_TY*)(x + ib*QK4_0/2 + BTYES_PER_THREAD_IN_BLK*il + 7*nb*QK4_0/2)); +#endif + + // Load activation +#if THREADS_PER_BLK == 2 // Each thread processes 1/2 block + yl.s01234567 = *(global float8 *)(yb); + yl.s89abcdef = *(global float8 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; + sumy += yl.s3; + sumy += yl.s4; + sumy += yl.s5; + sumy += yl.s6; + sumy += yl.s7; + sumy += yl.s8; yl.s8 /= 16.f; + sumy += yl.s9; yl.s9 /= 16.f; + sumy += yl.sa; yl.sa /= 16.f; + sumy += yl.sb; yl.sb /= 16.f; + sumy += yl.sc; yl.sc /= 16.f; + sumy += yl.sd; yl.sd /= 16.f; + sumy += yl.se; yl.se /= 16.f; + sumy += yl.sf; yl.sf /= 16.f; +#elif THREADS_PER_BLK == 4 // Each thread processes 1/4 block + yl.s0123 = *(global float4 *)(yb); + yl.s4567 = *(global float4 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; + sumy += yl.s3; + sumy += yl.s4; yl.s4 /= 16.f; + sumy += yl.s5; yl.s5 /= 16.f; + sumy += yl.s6; yl.s6 /= 16.f; + sumy += yl.s7; yl.s7 /= 16.f; +#elif THREADS_PER_BLK == 8 // Each thread processes 1/8 block + yl.s01 = *(global float2 *)(yb); + yl.s23 = *(global float2 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; yl.s2 /= 16.f; + sumy += yl.s3; yl.s3 /= 16.f; +#endif + + sumf.s0 += block_q_4_0_dot_y_flat(q_blk_0, *(d + ib + 0*nb), sumy, yl); + sumf.s1 += block_q_4_0_dot_y_flat(q_blk_1, *(d + ib + 1*nb), sumy, yl); +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + sumf.s2 += block_q_4_0_dot_y_flat(q_blk_2, *(d + ib + 2*nb), sumy, yl); + sumf.s3 += block_q_4_0_dot_y_flat(q_blk_3, *(d + ib + 3*nb), sumy, yl); +#endif +#if N_DST == 8 || N_DST == 16 + sumf.s4 += block_q_4_0_dot_y_flat(q_blk_4, *(d + ib + 4*nb), sumy, yl); + sumf.s5 += block_q_4_0_dot_y_flat(q_blk_5, *(d + ib + 5*nb), sumy, yl); + sumf.s6 += block_q_4_0_dot_y_flat(q_blk_6, *(d + ib + 6*nb), sumy, yl); + sumf.s7 += block_q_4_0_dot_y_flat(q_blk_7, *(d + ib + 7*nb), sumy, yl); +#endif + + yb += QK4_0 * (N_SIMDWIDTH/THREADS_PER_BLK); + } + + SUM_TY tot = (SUM_TY)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1) +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + , sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3) +#endif +#if N_DST == 8 || N_DST == 16 + , sub_group_reduce_add(sumf.s4), sub_group_reduce_add(sumf.s5) + , sub_group_reduce_add(sumf.s6), sub_group_reduce_add(sumf.s7) +#endif + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } +#endif +#if N_DST == 8 || N_DST == 16 + if (first_row + 4 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 4] = tot.s4; + } + if (first_row + 5 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 5] = tot.s5; + } + if (first_row + 6 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 6] = tot.s6; + } + if (first_row + 7 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 7] = tot.s7; + } +#endif + } +} + +//------------------------------------------------------------------------------ +// Using image1d_buffer_t + +#if defined(cl_qcom_subgroup_shuffle) +#pragma OPENCL EXTENSION cl_qcom_subgroup_shuffle : enable +float qcom_sub_group_reduce_add(float sum) { + sum += qcom_sub_group_shuffle_down(sum, 32, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + sum += qcom_sub_group_shuffle_down(sum, 16, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + sum += qcom_sub_group_shuffle_down(sum, 8, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + sum += qcom_sub_group_shuffle_down(sum, 4, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + sum += qcom_sub_group_shuffle_down(sum, 2, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + sum += qcom_sub_group_shuffle_down(sum, 1, CLK_SUB_GROUP_SHUFFLE_WIDTH_WAVE_SIZE_QCOM, 0.f); + return sum; +} +#define sub_group_reduce_add qcom_sub_group_reduce_add +#else +#define sub_group_reduce_add sub_group_reduce_add +#endif + +#undef THREADS_PER_BLK +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define THREADS_PER_BLK 4 // Number of threads per block, or each thread process 1/THREADS_PER_BLK of a block +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 16 +#elif defined (ADRENO_GPU) +#define THREADS_PER_BLK 4 +#define N_DST 4 +#define N_SIMDGROUP 1 +#define N_SIMDWIDTH 64 +#endif + +#if THREADS_PER_BLK == 2 // Each thread processes 1/2 block +# define ACT_TY float16 +# define Q_BLK_LD_TY float2 +# define EXTRACT_BLK_DATA(tmp, part) *((float2*)&tmp + part) +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v8 +#elif THREADS_PER_BLK == 4 // Each thread processes 1/4 block +# define ACT_TY float8 +# define Q_BLK_LD_TY float +# define EXTRACT_BLK_DATA(tmp, part) *((float*)&tmp + part) +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v4 +#elif THREADS_PER_BLK == 8 // Each thread processes 1/8 block +# define ACT_TY float4 +# define Q_BLK_LD_TY half +# define EXTRACT_BLK_DATA(tmp, part) *((half*)&tmp + part) +# define block_q_4_0_dot_y_flat block_q_4_0_dot_y_flat_v2 +#endif + +#define BTYES_PER_THREAD_IN_BLK (QK4_0/2/THREADS_PER_BLK) + +#if N_DST == 2 +# define SUM_TY float2 +#elif N_DST == 4 +# define SUM_TY float4 +#elif N_DST == 8 +# define SUM_TY float8 +#elif N_DST == 16 +# define SUM_TY float16 +#endif + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mat_q4_0_f32_flat_img_v0( + read_only image1d_buffer_t src0_q, + read_only image1d_buffer_t src0_d, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + const int nb = ne00/QK4_0; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + int first_row = (r0 * N_SIMDGROUP + get_sub_group_id()) * N_DST; + + int i12 = im%ne12; + int i13 = im/ne12; + + // The number of scales is the same as the number of blocks. + ulong offset0_d = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + // Each block contains QK4_0/2 uchars, hence offset for qs is as follows. + ulong offset0_q = first_row * nb + (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + + global float * y = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + int ix = get_sub_group_local_id()/THREADS_PER_BLK; + int il = get_sub_group_local_id()%THREADS_PER_BLK; + + global float * yb = y + ix*QK4_0 + BTYES_PER_THREAD_IN_BLK*il; + + // Registers for caching activation + ACT_TY yl = 0.f; + + // Registers for caching quants + Q_BLK_LD_TY q_blk_0 = 0, q_blk_1 = 0; +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + Q_BLK_LD_TY q_blk_2 = 0, q_blk_3 = 0; +#endif +#if N_DST == 8 || N_DST == 16 + Q_BLK_LD_TY q_blk_4 = 0, q_blk_5 = 0, q_blk_6 = 0, q_blk_7 = 0; +#endif + + // Partial sum + SUM_TY sumf = 0.f; + + for (int ib = ix; ib < nb; ib += N_SIMDWIDTH/THREADS_PER_BLK) { + float sumy = 0.f;; + + float4 tmp; + tmp = read_imagef(src0_q, offset0_q + ib + 0*nb); + q_blk_0 = EXTRACT_BLK_DATA(tmp, il); + tmp = read_imagef(src0_q, offset0_q + ib + 1*nb); + q_blk_1 = EXTRACT_BLK_DATA(tmp, il); +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + tmp = read_imagef(src0_q, offset0_q + ib + 2*nb); + q_blk_2 = EXTRACT_BLK_DATA(tmp, il); + tmp = read_imagef(src0_q, offset0_q + ib + 3*nb); + q_blk_3 = EXTRACT_BLK_DATA(tmp, il); +#endif +#if N_DST == 8 || N_DST == 16 + tmp = read_imagef(src0_q, offset0_q + ib + 4*nb); + q_blk_4 = EXTRACT_BLK_DATA(tmp, il); + tmp = read_imagef(src0_q, offset0_q + ib + 5*nb); + q_blk_5 = EXTRACT_BLK_DATA(tmp, il); + tmp = read_imagef(src0_q, offset0_q + ib + 6*nb); + q_blk_6 = EXTRACT_BLK_DATA(tmp, il); + tmp = read_imagef(src0_q, offset0_q + ib + 7*nb); + q_blk_7 = EXTRACT_BLK_DATA(tmp, il); +#endif + + // Load activation +#if THREADS_PER_BLK == 2 // Each thread processes 1/2 block + yl.s01234567 = *(global float8 *)(yb); + yl.s89abcdef = *(global float8 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; + sumy += yl.s3; + sumy += yl.s4; + sumy += yl.s5; + sumy += yl.s6; + sumy += yl.s7; + sumy += yl.s8; yl.s8 /= 16.f; + sumy += yl.s9; yl.s9 /= 16.f; + sumy += yl.sa; yl.sa /= 16.f; + sumy += yl.sb; yl.sb /= 16.f; + sumy += yl.sc; yl.sc /= 16.f; + sumy += yl.sd; yl.sd /= 16.f; + sumy += yl.se; yl.se /= 16.f; + sumy += yl.sf; yl.sf /= 16.f; +#elif THREADS_PER_BLK == 4 // Each thread processes 1/4 block + yl.s0123 = *(global float4 *)(yb); + yl.s4567 = *(global float4 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; + sumy += yl.s3; + sumy += yl.s4; yl.s4 /= 16.f; + sumy += yl.s5; yl.s5 /= 16.f; + sumy += yl.s6; yl.s6 /= 16.f; + sumy += yl.s7; yl.s7 /= 16.f; +#elif THREADS_PER_BLK == 8 // Each thread processes 1/8 block + yl.s01 = *(global float2 *)(yb); + yl.s23 = *(global float2 *)(yb + 16); + + sumy += yl.s0; + sumy += yl.s1; + sumy += yl.s2; yl.s2 /= 16.f; + sumy += yl.s3; yl.s3 /= 16.f; +#endif + + sumf.s0 += block_q_4_0_dot_y_flat(q_blk_0, read_imageh(src0_d, offset0_d + ib + 0*nb).s0, sumy, yl); + sumf.s1 += block_q_4_0_dot_y_flat(q_blk_1, read_imageh(src0_d, offset0_d + ib + 1*nb).s0, sumy, yl); +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + sumf.s2 += block_q_4_0_dot_y_flat(q_blk_2, read_imageh(src0_d, offset0_d + ib + 2*nb).s0, sumy, yl); + sumf.s3 += block_q_4_0_dot_y_flat(q_blk_3, read_imageh(src0_d, offset0_d + ib + 3*nb).s0, sumy, yl); +#endif +#if N_DST == 8 || N_DST == 16 + sumf.s4 += block_q_4_0_dot_y_flat(q_blk_4, read_imageh(src0_d, offset0_d + ib + 4*nb).s0, sumy, yl); + sumf.s5 += block_q_4_0_dot_y_flat(q_blk_5, read_imageh(src0_d, offset0_d + ib + 5*nb).s0, sumy, yl); + sumf.s6 += block_q_4_0_dot_y_flat(q_blk_6, read_imageh(src0_d, offset0_d + ib + 6*nb).s0, sumy, yl); + sumf.s7 += block_q_4_0_dot_y_flat(q_blk_7, read_imageh(src0_d, offset0_d + ib + 7*nb).s0, sumy, yl); +#endif + + yb += QK4_0 * (N_SIMDWIDTH/THREADS_PER_BLK); + } + + SUM_TY tot = (SUM_TY)( + sub_group_reduce_add(sumf.s0), sub_group_reduce_add(sumf.s1) +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + , sub_group_reduce_add(sumf.s2), sub_group_reduce_add(sumf.s3) +#endif +#if N_DST == 8 || N_DST == 16 + , sub_group_reduce_add(sumf.s4), sub_group_reduce_add(sumf.s5) + , sub_group_reduce_add(sumf.s6), sub_group_reduce_add(sumf.s7) +#endif + ); + + if (get_sub_group_local_id() == 0) { + if (first_row + 0 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 0] = tot.s0; + } + if (first_row + 1 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 1] = tot.s1; + } +#if N_DST == 4 || N_DST == 8 || N_DST == 16 + if (first_row + 2 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 2] = tot.s2; + } + if (first_row + 3 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 3] = tot.s3; + } +#endif +#if N_DST == 8 || N_DST == 16 + if (first_row + 4 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 4] = tot.s4; + } + if (first_row + 5 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 5] = tot.s5; + } + if (first_row + 6 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 6] = tot.s6; + } + if (first_row + 7 < ne01) { + dst[r1*ne0 + im*ne0*ne1 + first_row + 7] = tot.s7; + } +#endif + } +} + +//------------------------------------------------------------------------------ +// kernel_mul_mv_q6_K_f32 +//------------------------------------------------------------------------------ + +#undef N_DST +#undef N_SIMDGROUP +#undef N_SIMDWIDTH + +#ifdef INTEL_GPU +#define N_DST 1 // number of rows each SIMD group works on +#define N_SIMDGROUP 2 // number of SIMD groups in a thread group +#define N_SIMDWIDTH 16 // SIMD group size +#elif defined (ADRENO_GPU) +#define N_DST 1 +#define N_SIMDGROUP 2 +#define N_SIMDWIDTH 64 +#endif + +#define BLOCK_STRIDE (N_SIMDWIDTH/16) // number of blocks each subgroup processes + +#ifdef INTEL_GPU +REQD_SUBGROUP_SIZE_16 +#elif defined (ADRENO_GPU) +REQD_SUBGROUP_SIZE_64 +#endif +kernel void kernel_mul_mv_q6_K_f32( + global void * src0, + ulong offset0, + global float * src1, + ulong offset1, + global float * dst, + ulong offsetd, + int ne00, + int ne01, + int ne02, + int ne10, + int ne12, + int ne0, + int ne1, + int r2, + int r3 +) { + src0 = (global void*)((global char*)src0 + offset0); + src1 = (global float*)((global char*)src1 + offset1); + dst = (global float*)((global char*)dst + offsetd); + + uchar kmask1 = 0x03; + uchar kmask2 = 0x0C; + uchar kmask3 = 0x30; + uchar kmask4 = 0xC0; + + int nb = ne00/QK_K; + + int r0 = get_group_id(0); + int r1 = get_group_id(1); + int im = get_group_id(2); + + int row = N_SIMDGROUP * r0 + get_sub_group_id(); + + int i12 = im%ne12; + int i13 = im/ne12; + + ulong offset_src0 = (i12/r2)*(nb*ne01) + (i13/r3)*(nb*ne01*ne02); + + global block_q6_K * x = (global block_q6_K *) src0 + row*nb + offset_src0; + global float * yy = (global float *) src1 + r1*ne10 + im*ne00*ne1; + + float sumf = 0; + + // For Q6_K quantization, 16 values forms a subblock, 16 subblock forms a + // block. Values in a subblock shares a scale that is quantized with 8 bits; + // the entire block shares a single floating point scale. + // For work distribution, each thread processes a subblock (16 weights), hence + // 16 threads process a (super) block -- a subgroup thus handles SIMDWIDTH/16 + // (super) blocks -- this is the block stride. + // The 16 threads that process a (super) block are split into 2 portions, each has + // 8 threads; each portion works on 8 subblocks. + // For subgroup of 16 threads, the entire subgroup works on a single (super) block + // before moving to the next (super) block. Thread0 - thread7 work on the + // first 8 subblocks; thread8 - thread15 works on the last 8 subblocks. + // Thread0 - thread3 work on subblocks 0, 2, 4, 6; thread4 - thread7 work on + // subblocks 1, 3, 5, 7. Each thread does not work on an entire subblock, but + // works on a total of 16 weight values. + int tid = get_sub_group_local_id()/BLOCK_STRIDE; // first block_stride groups have tid=0 + int ix = get_sub_group_local_id()%BLOCK_STRIDE; // first block is 0..block_stride-1 + int ip = tid/8; // first or second half of (super) block (0 or 1) + int il = tid%8; // each half has 8 parts, one per scale + int n = 4; // 4 scales at a time (and 4 sums) + int l0 = n*il; // offset into half-block, 0..28 + int is = 8*ip + l0/16; // 0, 1, 8, 9 + + int y_offset = 128*ip + l0; + int q_offset_l = 64*ip + l0; + int q_offset_h = 32*ip + l0; + + for (int i = ix; i < nb; i += BLOCK_STRIDE) { + + global uint8_t * q1 = x[i].ql + q_offset_l; + global uint8_t * q2 = q1 + QK_K/8; + global uint8_t * qh = x[i].qh + q_offset_h; + global int8_t * sc = x[i].scales + is; + + global float * y = yy + i * QK_K + y_offset; + + float dall = x[i].d; + + float4 sums = {0.f, 0.f, 0.f, 0.f}; + + sums.s0 += y[0+ 0] * ((float)((q1[0] & 0xF) | ((qh[0] & kmask1) << 4)) - 32.f); + sums.s1 += y[0+32] * ((float)((q2[0] & 0xF) | ((qh[0] & kmask2) << 2)) - 32.f); + sums.s2 += y[0+64] * ((float)((q1[0] >> 4) | ((qh[0] & kmask3) << 0)) - 32.f); + sums.s3 += y[0+96] * ((float)((q2[0] >> 4) | ((qh[0] & kmask4) >> 2)) - 32.f); + + sums.s0 += y[1+ 0] * ((float)((q1[1] & 0xF) | ((qh[1] & kmask1) << 4)) - 32.f); + sums.s1 += y[1+32] * ((float)((q2[1] & 0xF) | ((qh[1] & kmask2) << 2)) - 32.f); + sums.s2 += y[1+64] * ((float)((q1[1] >> 4) | ((qh[1] & kmask3) << 0)) - 32.f); + sums.s3 += y[1+96] * ((float)((q2[1] >> 4) | ((qh[1] & kmask4) >> 2)) - 32.f); + + sums.s0 += y[2+ 0] * ((float)((q1[2] & 0xF) | ((qh[2] & kmask1) << 4)) - 32.f); + sums.s1 += y[2+32] * ((float)((q2[2] & 0xF) | ((qh[2] & kmask2) << 2)) - 32.f); + sums.s2 += y[2+64] * ((float)((q1[2] >> 4) | ((qh[2] & kmask3) << 0)) - 32.f); + sums.s3 += y[2+96] * ((float)((q2[2] >> 4) | ((qh[2] & kmask4) >> 2)) - 32.f); + + sums.s0 += y[3+ 0] * ((float)((q1[3] & 0xF) | ((qh[3] & kmask1) << 4)) - 32.f); + sums.s1 += y[3+32] * ((float)((q2[3] & 0xF) | ((qh[3] & kmask2) << 2)) - 32.f); + sums.s2 += y[3+64] * ((float)((q1[3] >> 4) | ((qh[3] & kmask3) << 0)) - 32.f); + sums.s3 += y[3+96] * ((float)((q2[3] >> 4) | ((qh[3] & kmask4) >> 2)) - 32.f); + + sumf += dall * (sums.s0 * sc[0] + sums.s1 * sc[2] + sums.s2 * sc[4] + sums.s3 * sc[6]); + } + + float tot = sub_group_reduce_add(sumf); + if (get_sub_group_local_id() == 0) { + dst[r1*ne0 + im*ne0*ne1 + row] = tot; + } +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl new file mode 100644 index 000000000..57768c803 --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_mul_mat_Ab_Bi_8x4.cl @@ -0,0 +1,130 @@ +// src0_q, src0_d, src1 are transposed as a preprocessing step +// 4-bit weights are transposed in groups of 4 (unsigned short int) +// consider weights originally "next to each other", now "on top of each other" +// each fiber computes a 8x4 tile of output elements +// using unshuffled weights + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#pragma OPENCL EXTENSION cl_qcom_reqd_sub_group_size : enable + +__attribute__((qcom_reqd_sub_group_size("full"))) +kernel void kernel_mul_mat_Ab_Bi_8x4( + global const ushort * src0_q, // quantized A + global const half * src0_d, // A scales + __read_only image1d_buffer_t src1, // B (1d image) + global float * dst, // C + int m, // M + int n, // N with padding + int k, // K + int n_no_padding // N without padding +) { + + int m_4 = m >> 2; + int n_4 = n >> 2; + + int gy = get_global_id(0); + int gx = get_global_id(1); + int gx_2 = gx << 2; + + half8 c0 = 0, c1 = 0, c2 = 0, c3 = 0; // 8x4 output elements + half8 B; // registers for activations + half4 dequantized_weights; // registers for dequantized weights + __global const ushort* weight_ptr = src0_q + gx_2; // pointer for weights + __global const half* scale_ptr = src0_d + gx_2; // pointer for scales + + for(int i=0; i> 4) - 8) * scale.s0; // dequantize a row of the 16 weights + dequantized_weights.s1 = (((bits4.s1 & (0x00F0)) >> 4) - 8) * scale.s1; + dequantized_weights.s2 = (((bits4.s2 & (0x00F0)) >> 4) - 8) * scale.s2; + dequantized_weights.s3 = (((bits4.s3 & (0x00F0)) >> 4) - 8) * scale.s3; + c0 += B * dequantized_weights.s0; //vector-scalar multiplication to accumulate + c1 += B * dequantized_weights.s1; + c2 += B * dequantized_weights.s2; + c3 += B * dequantized_weights.s3; + + // j=2 + B.s0123 = read_imageh(src1, gy*2 + (i+2)*(n_4)); + B.s4567 = read_imageh(src1, gy*2 + (i+2)*(n_4)+1); + dequantized_weights.s0 = (((bits4.s0 & (0x0F00)) >> 8) - 8) * scale.s0; // dequantize a row of the 16 weights + dequantized_weights.s1 = (((bits4.s1 & (0x0F00)) >> 8) - 8) * scale.s1; + dequantized_weights.s2 = (((bits4.s2 & (0x0F00)) >> 8) - 8) * scale.s2; + dequantized_weights.s3 = (((bits4.s3 & (0x0F00)) >> 8) - 8) * scale.s3; + c0 += B * dequantized_weights.s0; // vector-scalar multiplication to accumulate + c1 += B * dequantized_weights.s1; + c2 += B * dequantized_weights.s2; + c3 += B * dequantized_weights.s3; + + // j=3 + B.s0123 = read_imageh(src1, gy*2 + (i+3)*(n_4)); + B.s4567 = read_imageh(src1, gy*2 + (i+3)*(n_4)+1); + dequantized_weights.s0 = (((bits4.s0 & (0xF000)) >> 12) - 8) * scale.s0; // dequantize a row of the 16 weights + dequantized_weights.s1 = (((bits4.s1 & (0xF000)) >> 12) - 8) * scale.s1; + dequantized_weights.s2 = (((bits4.s2 & (0xF000)) >> 12) - 8) * scale.s2; + dequantized_weights.s3 = (((bits4.s3 & (0xF000)) >> 12) - 8) * scale.s3; + c0 += B * dequantized_weights.s0; // vector-scalar multiplication to accumulate + c1 += B * dequantized_weights.s1; + c2 += B * dequantized_weights.s2; + c3 += B * dequantized_weights.s3; + } + + int idx = (gy<<3)*m + (gx<<2); // vectorized store 16 elements + + // conditional check if store is to a valid location. Required when N is not a multiple of 8 + // if statements allow registers to be reused for each store + // provides a performance boost due to reduced register footprint, which increases number of concurrent waves + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s0, c1.s0, c2.s0, c3.s0), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s1, c1.s1, c2.s1, c3.s1), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s2, c1.s2, c2.s2, c3.s2), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s3, c1.s3, c2.s3, c3.s3), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s4, c1.s4, c2.s4, c3.s4), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s5, c1.s5, c2.s5, c3.s5), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s6, c1.s6, c2.s6, c3.s6), 0, dst + idx); + idx += m; + } + if(idx+3 < m*n_no_padding){ + vstore4((float4)(c0.s7, c1.s7, c2.s7, c3.s7), 0, dst + idx); + } +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_16.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_16.cl new file mode 100644 index 000000000..d59a0c05d --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_16.cl @@ -0,0 +1,32 @@ +// 16-bit transpose, loading/storing an 8x8 tile of elements + +kernel void kernel_transpose_16( + __read_only image1d_buffer_t input, + __write_only image1d_buffer_t output, + const uint rows, + const uint cols +) { + + const int i = get_global_id(0); + const int j = get_global_id(1); + const int i_3 = i<<3; + const int j_3 = j<<3; + + ushort8 temp0 = as_ushort8(read_imagef(input, (j_3+0)*cols+i)); + ushort8 temp1 = as_ushort8(read_imagef(input, (j_3+1)*cols+i)); + ushort8 temp2 = as_ushort8(read_imagef(input, (j_3+2)*cols+i)); + ushort8 temp3 = as_ushort8(read_imagef(input, (j_3+3)*cols+i)); + ushort8 temp4 = as_ushort8(read_imagef(input, (j_3+4)*cols+i)); + ushort8 temp5 = as_ushort8(read_imagef(input, (j_3+5)*cols+i)); + ushort8 temp6 = as_ushort8(read_imagef(input, (j_3+6)*cols+i)); + ushort8 temp7 = as_ushort8(read_imagef(input, (j_3+7)*cols+i)); + + write_imagef(output, (i_3+0)*rows+j, as_float4((ushort8)(temp0.s0, temp1.s0, temp2.s0, temp3.s0, temp4.s0, temp5.s0, temp6.s0, temp7.s0))); + write_imagef(output, (i_3+1)*rows+j, as_float4((ushort8)(temp0.s1, temp1.s1, temp2.s1, temp3.s1, temp4.s1, temp5.s1, temp6.s1, temp7.s1))); + write_imagef(output, (i_3+2)*rows+j, as_float4((ushort8)(temp0.s2, temp1.s2, temp2.s2, temp3.s2, temp4.s2, temp5.s2, temp6.s2, temp7.s2))); + write_imagef(output, (i_3+3)*rows+j, as_float4((ushort8)(temp0.s3, temp1.s3, temp2.s3, temp3.s3, temp4.s3, temp5.s3, temp6.s3, temp7.s3))); + write_imagef(output, (i_3+4)*rows+j, as_float4((ushort8)(temp0.s4, temp1.s4, temp2.s4, temp3.s4, temp4.s4, temp5.s4, temp6.s4, temp7.s4))); + write_imagef(output, (i_3+5)*rows+j, as_float4((ushort8)(temp0.s5, temp1.s5, temp2.s5, temp3.s5, temp4.s5, temp5.s5, temp6.s5, temp7.s5))); + write_imagef(output, (i_3+6)*rows+j, as_float4((ushort8)(temp0.s6, temp1.s6, temp2.s6, temp3.s6, temp4.s6, temp5.s6, temp6.s6, temp7.s6))); + write_imagef(output, (i_3+7)*rows+j, as_float4((ushort8)(temp0.s7, temp1.s7, temp2.s7, temp3.s7, temp4.s7, temp5.s7, temp6.s7, temp7.s7))); +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32.cl new file mode 100644 index 000000000..914ec0193 --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32.cl @@ -0,0 +1,25 @@ +// 32-bit transpose, loading/storing a 4x4 tile of elements + +kernel void kernel_transpose_32( + __read_only image1d_buffer_t input, + __write_only image1d_buffer_t output, + const uint rows, + const uint cols +) { + + const int i = get_global_id(0); + const int j = get_global_id(1); + const int i_2 = i<<2; + const int j_2 = j<<2; + + float4 temp0 = read_imagef(input, (j_2+0)*cols+i); + float4 temp1 = read_imagef(input, (j_2+1)*cols+i); + float4 temp2 = read_imagef(input, (j_2+2)*cols+i); + float4 temp3 = read_imagef(input, (j_2+3)*cols+i); + + write_imagef(output, (i_2+0)*rows+j, (float4)(temp0.s0, temp1.s0, temp2.s0, temp3.s0)); + write_imagef(output, (i_2+1)*rows+j, (float4)(temp0.s1, temp1.s1, temp2.s1, temp3.s1)); + write_imagef(output, (i_2+2)*rows+j, (float4)(temp0.s2, temp1.s2, temp2.s2, temp3.s2)); + write_imagef(output, (i_2+3)*rows+j, (float4)(temp0.s3, temp1.s3, temp2.s3, temp3.s3)); + +} diff --git a/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32_16.cl b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32_16.cl new file mode 100644 index 000000000..d3bd1fabb --- /dev/null +++ b/ggml/src/ggml-opencl/kernels/ggml-opencl_transpose_32_16.cl @@ -0,0 +1,35 @@ +// 32-bit transpose, loading/storing a 4x4 tile of elements +// Only used for activations +// converts to FP16 +// also adds zero padding for non multiple of 8 prompt lengths +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +kernel void kernel_transpose_32_16(__read_only image1d_buffer_t input, __write_only image1d_buffer_t output, const uint rows, const uint cols, const uint padded_rows) { + + const int i = get_global_id(0); + const int j = get_global_id(1); + const int i_2 = i<<2; + const int j_2 = j<<2; + half4 temp0 = {0,0,0,0}; // initialize outputs to 0 + half4 temp1 = {0,0,0,0}; + half4 temp2 = {0,0,0,0}; + half4 temp3 = {0,0,0,0}; + + if((j_2+0)*cols+i*4+3 < rows*cols*16){ // only load from a valid location. Otherwise keep register data as 0 + temp0 = read_imageh(input, (j_2+0)*cols+i); + } + if((j_2+1)*cols+i*4+3 < rows*cols*16){ + temp1 = read_imageh(input, (j_2+1)*cols+i); + } + if((j_2+2)*cols+i*4+3 < rows*cols*16){ + temp2 = read_imageh(input, (j_2+2)*cols+i); + } + if((j_2+3)*cols+i*4+3 < rows*cols*16){ + temp3 = read_imageh(input, (j_2+3)*cols+i); + } + + write_imageh(output, (i_2+0)*padded_rows+j, (half4)(temp0.s0, temp1.s0, temp2.s0, temp3.s0)); // no conditionals for output, includes zero padding + write_imageh(output, (i_2+1)*padded_rows+j, (half4)(temp0.s1, temp1.s1, temp2.s1, temp3.s1)); + write_imageh(output, (i_2+2)*padded_rows+j, (half4)(temp0.s2, temp1.s2, temp2.s2, temp3.s2)); + write_imageh(output, (i_2+3)*padded_rows+j, (half4)(temp0.s3, temp1.s3, temp2.s3, temp3.s3)); +} From 56eea0781cbd2608ed8ff524955495569b9264be Mon Sep 17 00:00:00 2001 From: cduk <19917266+cduk@users.noreply.github.com> Date: Fri, 13 Dec 2024 23:21:49 +0100 Subject: [PATCH 017/372] Removes spurious \r in output that causes logging in journalctl to treat lines as binary and therefore hidden by default (#10771) Signed-off-by: Charles Darke Co-authored-by: Charles Darke --- examples/server/server.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 8cb992470..210c36e01 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -1079,9 +1079,9 @@ struct server_slot { SLT_INF(*this, "\n" - "\rprompt eval time = %10.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n" - "\r eval time = %10.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n" - "\r total time = %10.2f ms / %5d tokens\n", + "prompt eval time = %10.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n" + " eval time = %10.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n" + " total time = %10.2f ms / %5d tokens\n", t_prompt_processing, n_prompt_tokens_processed, t_prompt, n_prompt_second, t_token_generation, n_decoded, t_gen, n_gen_second, t_prompt_processing + t_token_generation, n_prompt_tokens_processed + n_decoded); From ba1cb19cdd0d92e012e0f6e009e0620f854b6afd Mon Sep 17 00:00:00 2001 From: HimariO Date: Sat, 14 Dec 2024 20:43:46 +0800 Subject: [PATCH 018/372] llama : add Qwen2VL support + multimodal RoPE (#10361) * Barebone Qwen2VL LLM convertor * Add Qwen2VL cli entrypoint * [WIP] add qwen2vl arch * Verify m-rope output * Add vl-rope/2d-rope support for qwen2vl ViT * update qwen2vl cli tool * update 5D tensor op workaround * [WIP] qwen2vl vision model * make batch and clip utils compatible with qwen2vl * [WIP] create inference workflow, gguf convert script but fix * correcting vision-rope behavior, add the missing last layer back to ViT * add arg parser to qwen2vl_surgery * replace variable size array with vector * cuda-gdb cmake preset * add fp32 mrope, vision rope kernel * add fp16 support for qwen2vl and m-rope * add `GGML_ROPE_TYPE_MROPE`, `GGML_ROPE_TYPE_VISION` * fix rope op mode switching, out dated func args * update `llama_hparams` * update to keep up stream changes * resolve linter, test errors * add makefile entry, update speical image padding token * add mrope unit test, fix few compiler warnings * rename `mrope` related function, params * minor updates on debug util, bug fixs * add `m-rope` testcase to `test-backend-ops` * Apply suggestions from code review Co-authored-by: Georgi Gerganov * fix traililng whitespce * store `llama_hparams.rope_sections` with fixed size array * update position id tensor size check in GGML_OP_ROPE * minor updates * update `ggml_backend_*_supports_op` of unsupported backends * remote old `rope_section` compare operator --------- Co-authored-by: Georgi Gerganov --- Makefile | 9 + README.md | 1 + convert_hf_to_gguf.py | 23 + examples/llava/CMakeLists.txt | 7 + examples/llava/clip.cpp | 230 ++++++++-- examples/llava/clip.h | 10 +- examples/llava/llava.cpp | 37 +- examples/llava/qwen2_vl_surgery.py | 158 +++++++ examples/llava/qwen2vl-cli.cpp | 581 +++++++++++++++++++++++++ ggml/include/ggml.h | 20 +- ggml/src/ggml-cann/ggml-cann.cpp | 9 + ggml/src/ggml-cpu/ggml-cpu.c | 244 +++++++++-- ggml/src/ggml-cuda/rope.cu | 231 +++++++++- ggml/src/ggml-kompute/ggml-kompute.cpp | 12 +- ggml/src/ggml-metal/ggml-metal.m | 16 +- ggml/src/ggml-sycl/ggml-sycl.cpp | 11 +- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 11 +- ggml/src/ggml.c | 52 ++- gguf-py/gguf/constants.py | 17 + gguf-py/gguf/gguf_writer.py | 3 + include/llama.h | 8 +- src/llama.cpp | 178 +++++++- tests/test-backend-ops.cpp | 38 +- tests/test-rope.cpp | 81 +++- 24 files changed, 1873 insertions(+), 114 deletions(-) create mode 100644 examples/llava/qwen2_vl_surgery.py create mode 100644 examples/llava/qwen2vl-cli.cpp diff --git a/Makefile b/Makefile index bcea450e4..19ae0d5f1 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ BUILD_TARGETS = \ llama-infill \ llama-llava-cli \ llama-minicpmv-cli\ + llama-qwen2vl-cli\ llama-lookahead \ llama-lookup \ llama-lookup-create \ @@ -1404,6 +1405,14 @@ llama-minicpmv-cli: examples/llava/minicpmv-cli.cpp \ $(OBJ_ALL) $(CXX) $(CXXFLAGS) $< $(filter-out %.h $<,$^) -o $@ $(LDFLAGS) -Wno-cast-qual +llama-qwen2vl-cli: examples/llava/qwen2vl-cli.cpp \ + examples/llava/llava.cpp \ + examples/llava/llava.h \ + examples/llava/clip.cpp \ + examples/llava/clip.h \ + $(OBJ_ALL) + $(CXX) $(CXXFLAGS) $< $(filter-out %.h $<,$^) -o $@ $(LDFLAGS) -Wno-cast-qual + ifeq ($(UNAME_S),Darwin) swift: examples/batched.swift (cd examples/batched.swift; make build) diff --git a/README.md b/README.md index 54466c250..49095acc8 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ Instructions for adding support for new models: [HOWTO-add-model.md](docs/develo - [x] [Mini CPM](https://huggingface.co/models?search=MiniCPM) - [x] [Moondream](https://huggingface.co/vikhyatk/moondream2) - [x] [Bunny](https://github.com/BAAI-DCAI/Bunny) +- [x] [Qwen2-VL](https://huggingface.co/collections/Qwen/qwen2-vl-66cee7455501d7126940800d) diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index c63d929c1..206ab502e 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -2001,6 +2001,29 @@ class Qwen2Model(Model): self.gguf_writer.add_rope_scaling_orig_ctx_len(self.hparams["rope_scaling"]["original_max_position_embeddings"]) +@Model.register("Qwen2VLForConditionalGeneration") +class Qwen2VLModel(Model): + model_arch = gguf.MODEL_ARCH.QWEN2VL + + def set_gguf_parameters(self): + super().set_gguf_parameters() + mrope_section = self.hparams["rope_scaling"]["mrope_section"] + mrope_section += [0] * max(0, 4 - len(mrope_section)) + self.gguf_writer.add_rope_dimension_sections(mrope_section) + + def set_vocab(self): + try: + self._set_vocab_sentencepiece() + except FileNotFoundError: + self._set_vocab_gpt2() + + def get_tensors(self) -> Iterator[tuple[str, Tensor]]: + for name, data in super().get_tensors(): + if name.startswith("visual."): + continue + yield name, data + + @Model.register("Qwen2MoeForCausalLM") class Qwen2MoeModel(Model): model_arch = gguf.MODEL_ARCH.QWEN2MOE diff --git a/examples/llava/CMakeLists.txt b/examples/llava/CMakeLists.txt index 5d32f377f..3ce0d60c8 100644 --- a/examples/llava/CMakeLists.txt +++ b/examples/llava/CMakeLists.txt @@ -43,3 +43,10 @@ set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME llama-minicpmv-cli) install(TARGETS ${TARGET} RUNTIME) target_link_libraries(${TARGET} PRIVATE common llava ${CMAKE_THREAD_LIBS_INIT}) target_compile_features(${TARGET} PRIVATE cxx_std_17) + +set(TARGET llama-qwen2vl-cli) +add_executable(${TARGET} qwen2vl-cli.cpp) +set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME llama-qwen2vl-cli) +install(TARGETS ${TARGET} RUNTIME) +target_link_libraries(${TARGET} PRIVATE common llava ${CMAKE_THREAD_LIBS_INIT}) +target_compile_features(${TARGET} PRIVATE cxx_std_17) diff --git a/examples/llava/clip.cpp b/examples/llava/clip.cpp index d7c94352b..ba28c07c6 100644 --- a/examples/llava/clip.cpp +++ b/examples/llava/clip.cpp @@ -102,7 +102,9 @@ static std::string format(const char * fmt, ...) { #define KEY_HAS_LLAVA_PROJ "clip.has_llava_projector" #define KEY_HAS_MINICPMV_PROJ "clip.has_minicpmv_projector" #define KEY_MINICPMV_VERSION "clip.minicpmv_version" +#define KEY_HAS_QWEN2VL_MERGER "clip.has_qwen2vl_merger" #define KEY_USE_GELU "clip.use_gelu" +#define KEY_USE_SILU "clip.use_silu" #define KEY_N_EMBD "clip.%s.embedding_length" #define KEY_N_FF "clip.%s.feed_forward_length" #define KEY_N_BLOCK "clip.%s.block_count" @@ -129,7 +131,8 @@ static std::string format(const char * fmt, ...) { #define TN_TOKEN_EMBD "%s.token_embd.weight" #define TN_POS_EMBD "%s.position_embd.weight" #define TN_CLASS_EMBD "v.class_embd" -#define TN_PATCH_EMBD "v.patch_embd.weight" +#define TN_PATCH_EMBD "v.patch_embd.weight" // not rename tensor with ".0" postfix for backwrad compat +#define TN_PATCH_EMBD_1 "v.patch_embd.weight.1" #define TN_PATCH_BIAS "v.patch_embd.bias" #define TN_ATTN_K "%s.blk.%d.attn_k.%s" #define TN_ATTN_Q "%s.blk.%d.attn_q.%s" @@ -163,6 +166,7 @@ enum projector_type { PROJECTOR_TYPE_LDP, PROJECTOR_TYPE_LDPV2, PROJECTOR_TYPE_RESAMPLER, + PROJECTOR_TYPE_MERGER, PROJECTOR_TYPE_UNKNOWN, }; @@ -171,6 +175,7 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_LDP, "ldp" }, { PROJECTOR_TYPE_LDPV2, "ldpv2"}, { PROJECTOR_TYPE_RESAMPLER, "resampler"}, + { PROJECTOR_TYPE_MERGER, "qwen2vl_merger"}, }; @@ -463,7 +468,8 @@ struct clip_vision_model { // embeddings struct ggml_tensor * class_embedding; - struct ggml_tensor * patch_embeddings; + struct ggml_tensor * patch_embeddings_0; + struct ggml_tensor * patch_embeddings_1; // second Conv2D kernel when we decouple Conv3D along temproal dimension (Qwen2VL) struct ggml_tensor * patch_bias; struct ggml_tensor * position_embeddings; @@ -553,6 +559,7 @@ struct clip_ctx { bool has_vision_encoder = false; bool has_llava_projector = false; bool has_minicpmv_projector = false; + bool has_qwen2vl_merger = false; int minicpmv_version = 2; struct clip_vision_model vision_model; @@ -561,6 +568,7 @@ struct clip_ctx { float image_mean[3]; float image_std[3]; bool use_gelu = false; + bool use_silu = false; int32_t ftype = 1; bool has_class_embedding = true; @@ -606,14 +614,26 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 image_size_height = imgs->data->ny; } } + else if (ctx->has_qwen2vl_merger) { + // use the image's native resolution when image is avaible + if (is_inf) { + // if (imgs->data->nx && imgs->data->ny) { + image_size_width = imgs->data->nx; + image_size_height = imgs->data->ny; + } + } const int patch_size = hparams.patch_size; const int num_patches = ((image_size_width / patch_size) * (image_size_height / patch_size)); + const int patches_w = image_size_width / patch_size; + const int patches_h = image_size_height / patch_size; const int num_positions = num_patches + (ctx->has_class_embedding ? 1 : 0); + const int num_position_ids = ctx->has_qwen2vl_merger ? num_positions * 4 : num_positions; const int hidden_size = hparams.hidden_size; const int n_head = hparams.n_head; const int d_head = hidden_size / n_head; int n_layer = hparams.n_layer; const float eps = hparams.eps; + int mrope_sections[4] = {d_head/4, d_head/4, d_head/4, d_head/4}; const int batch_size = imgs->size; @@ -634,10 +654,30 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 ggml_set_name(inp_raw, "inp_raw"); ggml_set_input(inp_raw); - struct ggml_tensor * inp = ggml_conv_2d(ctx0, model.patch_embeddings, inp_raw, patch_size, patch_size, 0, 0, 1, 1); + struct ggml_tensor * inp = ggml_conv_2d(ctx0, model.patch_embeddings_0, inp_raw, patch_size, patch_size, 0, 0, 1, 1); - inp = ggml_reshape_3d(ctx0, inp, num_patches, hidden_size, batch_size); - inp = ggml_cont(ctx0, ggml_permute(ctx0, inp, 1, 0, 2, 3)); + if (ctx->has_qwen2vl_merger) { + GGML_ASSERT(image_size_width % (patch_size * 2) == 0); + GGML_ASSERT(image_size_height % (patch_size * 2) == 0); + + auto inp_1 = ggml_conv_2d(ctx0, model.patch_embeddings_1, inp_raw, patch_size, patch_size, 0, 0, 1, 1); + inp = ggml_add(ctx0, inp, inp_1); + inp = ggml_cont(ctx0, ggml_permute(ctx0, inp, 1, 2, 0, 3)); // [w, h, c, b] -> [c, w, h, b] + inp = ggml_reshape_4d( + ctx0, inp, + hidden_size * 2, patches_w / 2, patches_h, batch_size); + inp = ggml_reshape_4d( + ctx0, inp, + hidden_size * 2, patches_w / 2, 2, batch_size * (patches_h / 2)); + inp = ggml_cont(ctx0, ggml_permute(ctx0, inp, 0, 2, 1, 3)); + inp = ggml_reshape_3d( + ctx0, inp, + hidden_size, patches_w * patches_h, batch_size); + } + else { + inp = ggml_reshape_3d(ctx0, inp, num_patches, hidden_size, batch_size); + inp = ggml_cont(ctx0, ggml_permute(ctx0, inp, 1, 0, 2, 3)); + } if (ctx->has_patch_bias) { // inp = ggml_add(ctx0, inp, ggml_repeat(ctx0, model.patch_bias, inp)); @@ -659,12 +699,14 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 } } - struct ggml_tensor * positions = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, num_positions); + struct ggml_tensor * positions = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, num_position_ids); ggml_set_name(positions, "positions"); ggml_set_input(positions); - embeddings = - ggml_add(ctx0, embeddings, ggml_get_rows(ctx0, model.position_embeddings, positions)); + if (!ctx->has_qwen2vl_merger) { // qwen2vl use rope position embedding + embeddings = + ggml_add(ctx0, embeddings, ggml_get_rows(ctx0, model.position_embeddings, positions)); + } if (ctx->has_minicpmv_projector) { int pos_w = image_size_width/patch_size; @@ -688,7 +730,8 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 } // loop over layers - if (ctx->has_minicpmv_projector) { + if (ctx->has_minicpmv_projector || ctx->has_qwen2vl_merger) { + // TODO: figure out why we doing thing in this way ??? n_layer += 1; } for (int il = 0; il < n_layer - 1; il++) { @@ -710,8 +753,13 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 struct ggml_tensor * Q = ggml_add(ctx0, ggml_mul_mat(ctx0, model.layers[il].q_w, cur), model.layers[il].q_b); - Q = ggml_scale_inplace(ctx0, Q, 1.0f / sqrt((float)d_head)); Q = ggml_reshape_4d(ctx0, Q, d_head, n_head, num_positions, batch_size); + if (ctx->has_qwen2vl_merger) { + Q = ggml_rope_multi( + ctx0, Q, positions, nullptr, + d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); + } + Q = ggml_scale_inplace(ctx0, Q, 1.0f / sqrt((float)d_head)); Q = ggml_cont(ctx0, ggml_permute(ctx0, Q, 0, 2, 1, 3)); Q = ggml_reshape_3d(ctx0, Q, d_head, num_positions, n_head * batch_size); @@ -719,6 +767,11 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 ggml_add(ctx0, ggml_mul_mat(ctx0, model.layers[il].k_w, cur), model.layers[il].k_b); K = ggml_reshape_4d(ctx0, K, d_head, n_head, num_positions, batch_size); + if (ctx->has_qwen2vl_merger) { + K = ggml_rope_multi( + ctx0, K, positions, nullptr, + d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); + } K = ggml_cont(ctx0, ggml_permute(ctx0, K, 0, 2, 1, 3)); K = ggml_reshape_3d(ctx0, K, d_head, num_positions, n_head * batch_size); @@ -758,6 +811,8 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 if (ctx->use_gelu) { cur = ggml_gelu_inplace(ctx0, cur); + } else if (ctx->use_silu) { + cur = ggml_silu_inplace(ctx0, cur); } else { cur = ggml_gelu_quick_inplace(ctx0, cur); } @@ -769,6 +824,7 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 cur = ggml_add(ctx0, embeddings, cur); embeddings = cur; + } // post-layernorm @@ -1030,6 +1086,19 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 GGML_ASSERT(false); } } + else if (ctx->proj_type == PROJECTOR_TYPE_MERGER) { + embeddings = ggml_reshape_3d(ctx0, embeddings, hidden_size * 4, num_positions / 4, batch_size); + + embeddings = ggml_mul_mat(ctx0, model.mm_0_w, embeddings); + embeddings = ggml_add(ctx0, embeddings, model.mm_0_b); + + // GELU activation + embeddings = ggml_gelu(ctx0, embeddings); + + // Second linear layer + embeddings = ggml_mul_mat(ctx0, model.mm_1_w, embeddings); + embeddings = ggml_add(ctx0, embeddings, model.mm_1_b); + } // build the graph ggml_build_forward_expand(gf, embeddings); @@ -1206,6 +1275,10 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) { new_clip->minicpmv_version = gguf_get_val_i32(ctx, idx); } + idx = gguf_find_key(ctx, KEY_HAS_QWEN2VL_MERGER); + if (idx != -1) { + new_clip->has_qwen2vl_merger = gguf_get_val_bool(ctx, idx); + } // GGML_ASSERT(new_clip->has_llava_projector); // see monatis/clip.cpp for image and/or text encoding for semantic search GGML_ASSERT(new_clip->has_vision_encoder); @@ -1214,6 +1287,13 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) { idx = get_key_idx(ctx, KEY_USE_GELU); new_clip->use_gelu = gguf_get_val_bool(ctx, idx); + try { + idx = get_key_idx(ctx, KEY_USE_SILU); + new_clip->use_silu = gguf_get_val_bool(ctx, idx); + } catch (std::runtime_error & /*e*/) { + new_clip->use_silu = false; + } + if (verbosity >= 1) { LOG_INF("%s: text_encoder: %d\n", __func__, new_clip->has_text_encoder); LOG_INF("%s: vision_encoder: %d\n", __func__, new_clip->has_vision_encoder); @@ -1389,11 +1469,16 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) { } try { - vision_model.patch_embeddings = get_tensor(new_clip->ctx_data, TN_PATCH_EMBD); + vision_model.patch_embeddings_0 = get_tensor(new_clip->ctx_data, TN_PATCH_EMBD); vision_model.position_embeddings = get_tensor(new_clip->ctx_data, format(TN_POS_EMBD, "v")); } catch(const std::exception& /*e*/) { LOG_ERR("%s: failed to load vision model tensors\n", __func__); } + try { + vision_model.patch_embeddings_1 = get_tensor(new_clip->ctx_data, TN_PATCH_EMBD_1); + } catch(const std::exception& /*e*/) { + new_clip->has_qwen2vl_merger = false; + } // LLaVA projection if (new_clip->proj_type == PROJECTOR_TYPE_MLP || new_clip->proj_type == PROJECTOR_TYPE_MLP_NORM) { @@ -1481,6 +1566,12 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) { vision_model.mm_model_ln_post_w = get_tensor(new_clip->ctx_data, format(TN_MINICPMV_LN, "post", "weight")); vision_model.mm_model_ln_post_b = get_tensor(new_clip->ctx_data, format(TN_MINICPMV_LN, "post", "bias")); } + else if (new_clip->proj_type == PROJECTOR_TYPE_MERGER) { + vision_model.mm_0_w = get_tensor(new_clip->ctx_data, format(TN_LLAVA_PROJ, 0, "weight")); + vision_model.mm_0_b = get_tensor(new_clip->ctx_data, format(TN_LLAVA_PROJ, 0, "bias")); + vision_model.mm_1_w = get_tensor(new_clip->ctx_data, format(TN_LLAVA_PROJ, 2, "weight")); + vision_model.mm_1_b = get_tensor(new_clip->ctx_data, format(TN_LLAVA_PROJ, 2, "bias")); + } else { std::string proj_type = PROJECTOR_TYPE_NAMES[new_clip->proj_type]; throw std::runtime_error(format("%s: don't support projector with: %s currently\n", __func__, proj_type.c_str())); @@ -1519,6 +1610,7 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) { new_clip->compute_alloc = ggml_gallocr_new(ggml_backend_get_default_buffer_type(new_clip->backend)); clip_image_f32_batch batch; batch.size = 1; + batch.data = nullptr; ggml_cgraph * gf = clip_image_build_graph(new_clip, &batch, nullptr, false); ggml_gallocr_reserve(new_clip->compute_alloc, gf); size_t compute_memory_buffer_size = ggml_gallocr_get_buffer_size(new_clip->compute_alloc, 0); @@ -1532,6 +1624,10 @@ void clip_add_load_image_size(struct clip_ctx * ctx_clip, struct clip_image_size ctx_clip->load_image_size = load_image_size; } +struct clip_image_size * clip_get_load_image_size(struct clip_ctx * ctx_clip) { + return ctx_clip->load_image_size; +} + struct clip_image_size * clip_image_size_init() { struct clip_image_size * load_image_size = new struct clip_image_size(); load_image_size->width = 448; @@ -1984,6 +2080,23 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, cli } return true; } + else if (ctx->has_qwen2vl_merger) { + clip_image_u8 * resized = clip_image_u8_init(); + auto patch_size = clip_patch_size(ctx) * 2; + int nx = ceil((float)img->nx / patch_size) * patch_size; + int ny = ceil((float)img->ny / patch_size) * patch_size; + bicubic_resize(*img, *resized, nx, ny); + + res_imgs->data = new clip_image_f32[1]; + // clip_image_f32 * res = clip_image_f32_init(); + normalize_image_u8_to_f32(resized, res_imgs->data, ctx->image_mean, ctx->image_std); + // res_imgs->data[0] = *res; + res_imgs->size = 1; + + // clip_image_f32_free(res); + clip_image_u8_free(resized); + return true; + } bool pad_to_square = true; if (!ctx->has_vision_encoder) { @@ -2173,6 +2286,13 @@ size_t clip_embd_nbytes(const struct clip_ctx * ctx) { return clip_n_patches(ctx) * clip_n_mmproj_embd(ctx) * sizeof(float); } +size_t clip_embd_nbytes_by_img(const struct clip_ctx * ctx, int img_h, int img_w) { + clip_image_f32 img; + img.nx = img_w; + img.ny = img_h; + return clip_n_patches_by_img(ctx, &img) * clip_n_mmproj_embd(ctx) * sizeof(float); +} + int32_t clip_image_size(const struct clip_ctx * ctx) { return ctx->vision_model.hparams.image_size; } @@ -2194,6 +2314,13 @@ const int32_t * clip_image_grid(const struct clip_ctx * ctx) { } int clip_n_patches(const struct clip_ctx * ctx) { + clip_image_f32 img; + img.nx = ctx->vision_model.hparams.image_size; + img.ny = ctx->vision_model.hparams.image_size; + return clip_n_patches_by_img(ctx, &img); +} + +int clip_n_patches_by_img(const struct clip_ctx * ctx, struct clip_image_f32 * img) { const auto & params = ctx->vision_model.hparams; int n_patches = (params.image_size / params.patch_size) * (params.image_size / params.patch_size); @@ -2207,6 +2334,11 @@ int clip_n_patches(const struct clip_ctx * ctx) { else if (ctx->minicpmv_version == 3) { n_patches = 64; } + } else if (ctx->proj_type == PROJECTOR_TYPE_MERGER) { + int patch_size = params.patch_size * 2; + int x_patch = img->nx / patch_size + (int)(img->nx % patch_size > 0); + int y_patch = img->ny / patch_size + (int)(img->ny % patch_size > 0); + n_patches = x_patch * y_patch; } return n_patches; @@ -2335,7 +2467,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima const int image_size = hparams.image_size; int image_size_width = image_size; int image_size_height = image_size; - if (ctx->has_minicpmv_projector) { + if (ctx->has_minicpmv_projector | ctx->has_qwen2vl_merger) { image_size_width = imgs->data[0].nx; image_size_height = imgs->data[0].ny; } @@ -2355,7 +2487,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima for (size_t i = 0; i < imgs->size; i++) { const int nx = imgs->data[i].nx; const int ny = imgs->data[i].ny; - if (!ctx->has_minicpmv_projector) { + if (!(ctx->has_minicpmv_projector | ctx->has_qwen2vl_merger)) { GGML_ASSERT(nx == image_size && ny == image_size); } @@ -2413,9 +2545,9 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima auto pos_embed_t = get_2d_sincos_pos_embed(embed_dim, std::make_pair(pos_w, pos_h)); float * pos_embed_data = (float *)malloc(ggml_nbytes(pos_embed)); - for(int i=0;ihas_qwen2vl_merger) { + struct ggml_tensor * positions = ggml_graph_get_tensor(gf, "positions"); + + const int pw = image_size_width / patch_size; + const int ph = image_size_height / patch_size; + int* positions_data = (int*)malloc(ggml_nbytes(positions)); + + int ptr = 0; + for (int y = 0; y < ph; y+=2) + { + for (int x = 0; x < pw; x+=2) + { + for (int dy = 0; dy < 2; dy++) { + for (int dx = 0; dx < 2; dx++) { + positions_data[ptr] = y + dy; + positions_data[num_patches + ptr] = x + dx; + positions_data[num_patches * 2 + ptr] = y + dy; + positions_data[num_patches * 3 + ptr] = x + dx; + ptr++; + } + } + } + } + + ggml_backend_tensor_set(positions, positions_data, 0, ggml_nbytes(positions)); + free(positions_data); + } + else { struct ggml_tensor * positions = ggml_graph_get_tensor(gf, "positions"); int* positions_data = (int*)malloc(ggml_nbytes(positions)); @@ -2444,16 +2603,16 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima } ggml_backend_tensor_set(positions, positions_data, 0, ggml_nbytes(positions)); free(positions_data); - } - { - struct ggml_tensor * patches = ggml_graph_get_tensor(gf, "patches"); - int* patches_data = (int*)malloc(ggml_nbytes(patches)); - for (int i = 0; i < num_patches; i++) { - patches_data[i] = i + 1; + { + struct ggml_tensor * patches = ggml_graph_get_tensor(gf, "patches"); + int* patches_data = (int*)malloc(ggml_nbytes(patches)); + for (int i = 0; i < num_patches; i++) { + patches_data[i] = i + 1; + } + ggml_backend_tensor_set(patches, patches_data, 0, ggml_nbytes(patches)); + free(patches_data); } - ggml_backend_tensor_set(patches, patches_data, 0, ggml_nbytes(patches)); - free(patches_data); } } @@ -2626,6 +2785,9 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) { return 3584; } } + if (ctx->proj_type == PROJECTOR_TYPE_MERGER) { + return ctx->vision_model.mm_1_b->ne[0]; + } std::string proj_type = PROJECTOR_TYPE_NAMES[ctx->proj_type]; throw std::runtime_error(format("%s: don't support projector with: %s currently\n", __func__, proj_type.c_str())); @@ -2637,3 +2799,21 @@ int clip_is_minicpmv(const struct clip_ctx * ctx) { } return 0; } + +bool clip_is_qwen2vl(const struct clip_ctx * ctx) { + return ctx->has_qwen2vl_merger; +} + + +bool clip_encode_float_image (struct clip_ctx * ctx, int n_threads, float * img, int h, int w, float * vec) { + clip_image_f32 clip_img; + clip_img.buf.resize(h * w * 3); + for (int i = 0; i < h*w*3; i++) + { + clip_img.buf[i] = img[i]; + } + clip_img.nx = w; + clip_img.ny = h; + clip_image_encode(ctx, n_threads, &clip_img, vec); + return true; +} diff --git a/examples/llava/clip.h b/examples/llava/clip.h index 78588bdf1..1603edd26 100644 --- a/examples/llava/clip.h +++ b/examples/llava/clip.h @@ -45,6 +45,7 @@ CLIP_API struct clip_ctx * clip_model_load_cpu(const char * fname, int verbosity CLIP_API void clip_free(struct clip_ctx * ctx); CLIP_API size_t clip_embd_nbytes(const struct clip_ctx * ctx); +CLIP_API size_t clip_embd_nbytes_by_img(const struct clip_ctx * ctx, int img_h, int img_w); CLIP_API int32_t clip_image_size (const struct clip_ctx * ctx); CLIP_API int32_t clip_patch_size (const struct clip_ctx * ctx); @@ -55,11 +56,13 @@ CLIP_API const char * clip_patch_merge_type(const struct clip_ctx * ctx); CLIP_API const int32_t * clip_image_grid(const struct clip_ctx * ctx); -CLIP_API int clip_n_patches (const struct clip_ctx * ctx); -CLIP_API int clip_n_mmproj_embd(const struct clip_ctx * ctx); +CLIP_API int clip_n_patches (const struct clip_ctx * ctx); +CLIP_API int clip_n_patches_by_img (const struct clip_ctx * ctx, struct clip_image_f32 * img); +CLIP_API int clip_n_mmproj_embd (const struct clip_ctx * ctx); CLIP_API int clip_uhd_num_image_embeds_col(struct clip_ctx * ctx_clip); CLIP_API void clip_add_load_image_size(struct clip_ctx * ctx_clip, struct clip_image_size * load_image_size); +CLIP_API struct clip_image_size * clip_get_load_image_size(struct clip_ctx * ctx_clip); CLIP_API struct clip_image_size * clip_image_size_init(); CLIP_API struct clip_image_u8 * clip_image_u8_init (); @@ -86,6 +89,9 @@ CLIP_API bool clip_image_batch_encode(struct clip_ctx * ctx, int n_threads, cons CLIP_API bool clip_model_quantize(const char * fname_inp, const char * fname_out, int itype); CLIP_API int clip_is_minicpmv(const struct clip_ctx * ctx); +CLIP_API bool clip_is_qwen2vl(const struct clip_ctx * ctx); + +CLIP_API bool clip_encode_float_image (struct clip_ctx * ctx, int n_threads, float * img, int h, int w, float * vec); #ifdef __cplusplus } diff --git a/examples/llava/llava.cpp b/examples/llava/llava.cpp index 4ca53a0b8..16f30c56c 100644 --- a/examples/llava/llava.cpp +++ b/examples/llava/llava.cpp @@ -259,25 +259,33 @@ static bool encode_image_with_clip(clip_ctx * ctx_clip, int n_threads, const cli const char * mm_patch_merge_type = clip_patch_merge_type(ctx_clip); - if (clip_is_minicpmv(ctx_clip)) { + if (clip_is_minicpmv(ctx_clip) || clip_is_qwen2vl(ctx_clip)) { std::vector image_embd_v; image_embd_v.resize(img_res_v.size); struct clip_image_size * load_image_size = clip_image_size_init(); + for (size_t i = 0; i < img_res_v.size; i++) { const int64_t t_img_enc_step_start_us = ggml_time_us(); - image_embd_v[i] = (float *)malloc(clip_embd_nbytes(ctx_clip)); + image_embd_v[i] = (float *)malloc(clip_embd_nbytes_by_img(ctx_clip, img_res_v.data[i].nx, img_res_v.data[i].ny)); int patch_size=14; load_image_size->width = img_res_v.data[i].nx; load_image_size->height = img_res_v.data[i].ny; clip_add_load_image_size(ctx_clip, load_image_size); + bool encoded = false; - int has_minicpmv_projector = clip_is_minicpmv(ctx_clip); - if (has_minicpmv_projector == 2) { - encoded = clip_image_encode(ctx_clip, n_threads, only_v2_5_reshape_by_patch(&img_res_v.data[i], patch_size), image_embd_v[i]); - } - else if (has_minicpmv_projector == 3) { + if (clip_is_qwen2vl(ctx_clip)) { encoded = clip_image_encode(ctx_clip, n_threads, &img_res_v.data[i], image_embd_v[i]); } + else { + int has_minicpmv_projector = clip_is_minicpmv(ctx_clip); + if (has_minicpmv_projector == 2) { + encoded = clip_image_encode(ctx_clip, n_threads, only_v2_5_reshape_by_patch(&img_res_v.data[i], patch_size), image_embd_v[i]); + } + else if (has_minicpmv_projector == 3) { + encoded = clip_image_encode(ctx_clip, n_threads, &img_res_v.data[i], image_embd_v[i]); + } + } + if (!encoded) { LOG_ERR("Unable to encode image - spatial_unpad - subimage %d of %d\n", (int) i+1, (int) img_res_v.size); return false; @@ -290,8 +298,11 @@ static bool encode_image_with_clip(clip_ctx * ctx_clip, int n_threads, const cli int n_img_pos_out = 0; for (size_t i = 0; i < image_embd_v.size(); i++) { - std::memcpy(image_embd + n_img_pos_out * clip_n_mmproj_embd(ctx_clip), image_embd_v[i], clip_embd_nbytes(ctx_clip)); - n_img_pos_out += clip_n_patches(ctx_clip); + std::memcpy( + image_embd + n_img_pos_out * clip_n_mmproj_embd(ctx_clip), + image_embd_v[i], + clip_embd_nbytes_by_img(ctx_clip, img_res_v.data[i].nx, img_res_v.data[i].ny)); + n_img_pos_out += clip_n_patches_by_img(ctx_clip, &img_res_v.data[i]); } *n_img_pos = n_img_pos_out; for (size_t i = 0; i < image_embd_v.size(); i++) { @@ -387,7 +398,13 @@ bool llava_image_embed_make_with_clip_img(clip_ctx * ctx_clip, int n_threads, co if (clip_is_minicpmv(ctx_clip)) { num_max_patches = 10; } - float * image_embd = (float *)malloc(clip_embd_nbytes(ctx_clip)*num_max_patches); // TODO: base on gridsize/llava model + float * image_embd; + if (clip_is_qwen2vl(ctx_clip)) { + // qwen2vl don't split image into chunks, so `num_max_patches` is not needed. + image_embd = (float *)malloc(clip_embd_nbytes_by_img(ctx_clip, img->nx, img->ny)); + } else { + image_embd = (float *)malloc(clip_embd_nbytes(ctx_clip)*num_max_patches); // TODO: base on gridsize/llava model + } if (!image_embd) { LOG_ERR("Unable to allocate memory for image embeddings\n"); return false; diff --git a/examples/llava/qwen2_vl_surgery.py b/examples/llava/qwen2_vl_surgery.py new file mode 100644 index 000000000..464ab80d3 --- /dev/null +++ b/examples/llava/qwen2_vl_surgery.py @@ -0,0 +1,158 @@ +import argparse +from typing import Dict + +import torch +import numpy as np +from gguf import * +from transformers import ( + Qwen2VLForConditionalGeneration, + Qwen2VLProcessor, + AutoProcessor, + Qwen2VLConfig +) + + +VISION = "clip.vision" + + +def k(raw_key: str, arch: str) -> str: + return raw_key.format(arch=arch) + + +def to_gguf_name(name: str) -> str: + og = name + name = name.replace("text_model", "t").replace("vision_model", "v") + name = name.replace("blocks", "blk").replace("embeddings.", "") + name = name.replace("attn.", "attn_") + name = name.replace("mlp.fc1", "ffn_down").replace("mlp.fc2", "ffn_up").replace("proj.", "out.") + # name = name.replace("layrnorm", "ln").replace("layer_norm", "ln").replace("layernorm", "ln") + name = name.replace("norm1", "ln1").replace("norm2", "ln2") + name = name.replace("merger.mlp", 'mm') + print(f"[to_gguf_name] {og} --> {name}") + return name + + +def find_vision_tensors(qwen2vl, dtype) -> Dict[str, np.ndarray]: + vision_model = qwen2vl.visual + tensor_map = {} + for name, ten in vision_model.state_dict().items(): + ten = ten.numpy() + if 'qkv' in name: + if ten.ndim == 2: # weight + c3, _ = ten.shape + else: # bias + c3 = ten.shape[0] + assert c3 % 3 == 0 + c = c3 // 3 + wq = ten[:c] + wk = ten[c: c * 2] + wv = ten[c * 2:] + tensor_map[to_gguf_name(f"vision_model.{name}").replace("qkv", "q")] = wq + tensor_map[to_gguf_name(f"vision_model.{name}").replace("qkv", "k")] = wk + tensor_map[to_gguf_name(f"vision_model.{name}").replace("qkv", "v")] = wv + elif 'merger' in name: + if name.endswith("ln_q.weight"): + tensor_map['v.post_ln.weight'] = ten + elif name.endswith("ln_q.bias"): + tensor_map['v.post_ln.bias'] = ten + else: + # "merger.mlp.%d.weight/bias" --> "mm.%d.weight/bias" + tensor_map[to_gguf_name(name)] = ten + elif 'patch_embed.proj.weight' in name: + # NOTE: split Conv3D into Conv2Ds + c1, c2, kt, kh, kw = ten.shape + assert kt == 2, "Current implmentation only support temporal_patch_size of 2" + tensor_map["v.patch_embd.weight"] = ten[:, :, 0, ...] + tensor_map["v.patch_embd.weight.1"] = ten[:, :, 1, ...] + else: + tensor_map[to_gguf_name(f"vision_model.{name}")] = ten + + for new_name, ten in tensor_map.items(): + if ten.ndim <= 1 or new_name.endswith("_norm.weight"): + tensor_map[new_name] = ten.astype(np.float32) + else: + tensor_map[new_name] = ten.astype(dtype) + tensor_map["v.position_embd.weight"] = np.zeros([10, 10], dtype=np.float32) # dummy tensor, just here as a placeholder + return tensor_map + + +def main(args): + if args.data_type == 'fp32': + dtype = torch.float32 + np_dtype = np.float32 + ftype = 0 + elif args.data_type == 'fp16': + dtype = torch.float32 + np_dtype = np.float16 + ftype = 1 + else: + raise ValueError() + + model_name = args.model_name + print("model_name: ", model_name) + qwen2vl = Qwen2VLForConditionalGeneration.from_pretrained( + model_name, torch_dtype=dtype, device_map="cpu" + ) + cfg: Qwen2VLConfig = qwen2vl.config # type: ignore[reportAssignmentType] + vcfg = cfg.vision_config + + if os.path.isdir(model_name): + if model_name.endswith(os.sep): + model_name = model_name[:-1] + model_name = os.path.basename(model_name) + fname_out = f"{model_name.replace('/', '-').lower()}-vision.gguf" + + fout = GGUFWriter(path=fname_out, arch="clip") + fout.add_description("image encoder for Qwen2VL") + + fout.add_file_type(ftype) + fout.add_bool("clip.has_text_encoder", False) + fout.add_bool("clip.has_vision_encoder", True) + fout.add_bool("clip.has_qwen2vl_merger", True) + fout.add_string("clip.projector_type", "qwen2vl_merger") + + print(cfg.vision_config) + if 'silu' in cfg.vision_config.hidden_act.lower(): + fout.add_bool("clip.use_silu", True) + fout.add_bool("clip.use_gelu", False) + elif 'gelu' in cfg.vision_config.hidden_act.lower(): + fout.add_bool("clip.use_silu", False) + fout.add_bool("clip.use_gelu", 'quick' not in cfg.vision_config.hidden_act.lower()) + else: + raise ValueError() + + tensor_map = find_vision_tensors(qwen2vl, np_dtype) + for name, data in tensor_map.items(): + fout.add_tensor(name, data) + + fout.add_uint32("clip.vision.patch_size", vcfg.patch_size) + fout.add_uint32("clip.vision.image_size", 14 * 40) # some reasonable size that is divable by (14*2) + fout.add_uint32(k(KEY_EMBEDDING_LENGTH, VISION), vcfg.embed_dim) + fout.add_uint32("clip.vision.projection_dim", vcfg.hidden_size) + fout.add_uint32(k(KEY_ATTENTION_HEAD_COUNT, VISION), vcfg.num_heads) + fout.add_float32(k(KEY_ATTENTION_LAYERNORM_EPS, VISION), 1e-6) + fout.add_uint32(k(KEY_BLOCK_COUNT, VISION), vcfg.depth) + fout.add_uint32(k(KEY_FEED_FORWARD_LENGTH, VISION), 0) # not sure what this does, put 0 here as a placeholder + fout.add_name(model_name) + """ + HACK: Since vision rope related parameter aren't stored in the `Qwen2VLConfig, + it will be hardcoded in the `clip_image_build_graph` from `clip.cpp`. + """ + + processor: Qwen2VLProcessor = AutoProcessor.from_pretrained(model_name) + fout.add_array("clip.vision.image_mean", processor.image_processor.image_mean) # type: ignore[reportAttributeAccessIssue] + fout.add_array("clip.vision.image_std", processor.image_processor.image_std) # type: ignore[reportAttributeAccessIssue] + + fout.write_header_to_file() + fout.write_kv_data_to_file() + fout.write_tensors_to_file() + fout.close() + print("save model as: ", fname_out) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("model_name", nargs='?', default="Qwen/Qwen2-VL-2B-Instruct") + parser.add_argument("--data_type", nargs='?', choices=['fp32', 'fp16'], default="fp32") + args = parser.parse_args() + main(args) diff --git a/examples/llava/qwen2vl-cli.cpp b/examples/llava/qwen2vl-cli.cpp new file mode 100644 index 000000000..e86a60280 --- /dev/null +++ b/examples/llava/qwen2vl-cli.cpp @@ -0,0 +1,581 @@ +#include "arg.h" +#include "base64.hpp" +#include "log.h" +#include "common.h" +#include "sampling.h" +#include "clip.h" +#include "llava.h" +#include "llama.h" +#include "ggml.h" + +#ifdef GGML_USE_CUDA +#include "ggml-cuda.h" +#endif +#ifdef NDEBUG +#include "ggml-alloc.h" +#include "ggml-backend.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + + +static bool qwen2vl_eval_image_embed(llama_context * ctx_llama, const struct llava_image_embed * image_embed, + int n_batch, int * n_past, int * st_pos_id, struct clip_image_size * image_size) { + int n_embd = llama_n_embd(llama_get_model(ctx_llama)); + const int patch_size = 14 * 2; + const int ph = image_size->height / patch_size + (image_size->height % patch_size > 0); + const int pw = image_size->width / patch_size + (image_size->width % patch_size > 0); + auto img_tokens = image_embed->n_image_pos; + // llama_pos mrope_pos[img_tokens * 4]; + std::vector mrope_pos; + mrope_pos.resize(img_tokens * 4); + + for (int y = 0; y < ph; y++) + { + for (int x = 0; x < pw; x++) + { + int i = y * pw + x; + mrope_pos[i] = *st_pos_id; + mrope_pos[i + img_tokens] = *st_pos_id + y; + mrope_pos[i + img_tokens * 2] = *st_pos_id + x; + mrope_pos[i + img_tokens * 3] = 0; + } + } + *st_pos_id += std::max(pw, ph); + + int processed = 0; + std::vector batch_mrope_pos; + batch_mrope_pos.resize(img_tokens * 4); + + for (int i = 0; i < img_tokens; i += n_batch) { + int n_eval = img_tokens - i; + if (n_eval > n_batch) { + n_eval = n_batch; + } + + // llama_pos batch_mrope_pos[n_eval * 4]; + std::fill(batch_mrope_pos.begin(), batch_mrope_pos.end(), 0); + memcpy(batch_mrope_pos.data(), &mrope_pos[processed], n_eval * sizeof(llama_pos)); + memcpy(&batch_mrope_pos[n_eval * 1], &mrope_pos[img_tokens * 1 + processed], n_eval * sizeof(llama_pos)); + memcpy(&batch_mrope_pos[n_eval * 2], &mrope_pos[img_tokens * 2 + processed], n_eval * sizeof(llama_pos)); + memcpy(&batch_mrope_pos[n_eval * 3], &mrope_pos[img_tokens * 3 + processed], n_eval * sizeof(llama_pos)); + + llama_batch batch = { + int32_t(n_eval), // n_tokens + nullptr, // token + (image_embed->embed+i*n_embd), // embed + batch_mrope_pos.data(), // pos + nullptr, // n_seq_id + nullptr, // seq_id + nullptr, // logits + }; + + if (llama_decode(ctx_llama, batch)) { + LOG_ERR("%s : failed to eval\n", __func__); + return false; + } + *n_past += n_eval; + processed += n_eval; + } + return true; +} + + +static bool eval_tokens(struct llama_context * ctx_llama, std::vector tokens, int n_batch, int * n_past, int * st_pos_id) { + int N = (int) tokens.size(); + std::vector pos; + for (int i = 0; i < N; i += n_batch) { + int n_eval = (int) tokens.size() - i; + if (n_eval > n_batch) { + n_eval = n_batch; + } + auto batch = llama_batch_get_one(&tokens[i], n_eval); + // TODO: add mrope pos ids somewhere else + pos.resize(batch.n_tokens * 4); + std::fill(pos.begin(), pos.end(), 0); + for (int j = 0; j < batch.n_tokens * 3; j ++) { + pos[j] = *st_pos_id + (j % batch.n_tokens); + } + batch.pos = pos.data(); + + if (llama_decode(ctx_llama, batch)) { + LOG_ERR("%s : failed to eval. token %d/%d (batch size %d, n_past %d)\n", __func__, i, N, n_batch, *n_past); + return false; + } + *n_past += n_eval; + *st_pos_id += n_eval; + } + return true; +} + +static bool eval_id(struct llama_context * ctx_llama, int id, int * n_past, int * st_pos_id) { + std::vector tokens; + tokens.push_back(id); + return eval_tokens(ctx_llama, tokens, 1, n_past, st_pos_id); +} + +static bool eval_string(struct llama_context * ctx_llama, const char* str, int n_batch, int * n_past, int * st_pos_id, bool add_bos){ + std::string str2 = str; + std::vector embd_inp = common_tokenize(ctx_llama, str2, add_bos, true); + eval_tokens(ctx_llama, embd_inp, n_batch, n_past, st_pos_id); + return true; +} + +static const char * sample(struct common_sampler * smpl, + struct llama_context * ctx_llama, + int * n_past, int * st_pos_id) { + const llama_token id = common_sampler_sample(smpl, ctx_llama, -1); + common_sampler_accept(smpl, id, true); + static std::string ret; + if (llama_token_is_eog(llama_get_model(ctx_llama), id)) { + ret = ""; + } else { + ret = common_token_to_piece(ctx_llama, id); + } + eval_id(ctx_llama, id, n_past, st_pos_id); + return ret.c_str(); +} + +static const char* IMG_BASE64_TAG_BEGIN = ""; + +static void find_image_tag_in_prompt(const std::string& prompt, size_t& begin_out, size_t& end_out) { + begin_out = prompt.find(IMG_BASE64_TAG_BEGIN); + end_out = prompt.find(IMG_BASE64_TAG_END, (begin_out == std::string::npos) ? 0UL : begin_out); +} + +static bool prompt_contains_image(const std::string& prompt) { + size_t begin, end; + find_image_tag_in_prompt(prompt, begin, end); + return (begin != std::string::npos); +} + +// replaces the base64 image tag in the prompt with `replacement` +static llava_image_embed * llava_image_embed_make_with_prompt_base64(struct clip_ctx * ctx_clip, int n_threads, const std::string& prompt) { + size_t img_base64_str_start, img_base64_str_end; + find_image_tag_in_prompt(prompt, img_base64_str_start, img_base64_str_end); + if (img_base64_str_start == std::string::npos || img_base64_str_end == std::string::npos) { + LOG_ERR("%s: invalid base64 image tag. must be %s%s\n", __func__, IMG_BASE64_TAG_BEGIN, IMG_BASE64_TAG_END); + return NULL; + } + + auto base64_bytes_start = img_base64_str_start + strlen(IMG_BASE64_TAG_BEGIN); + auto base64_bytes_count = img_base64_str_end - base64_bytes_start; + auto base64_str = prompt.substr(base64_bytes_start, base64_bytes_count ); + + auto required_bytes = base64::required_encode_size(base64_str.size()); + auto img_bytes = std::vector(required_bytes); + base64::decode(base64_str.begin(), base64_str.end(), img_bytes.begin()); + + auto embed = llava_image_embed_make_with_bytes(ctx_clip, n_threads, img_bytes.data(), img_bytes.size()); + if (!embed) { + LOG_ERR("%s: could not load image from base64 string.\n", __func__); + return NULL; + } + + return embed; +} + +static std::string remove_image_from_prompt(const std::string& prompt, const char * replacement = "") { + size_t begin, end; + find_image_tag_in_prompt(prompt, begin, end); + if (begin == std::string::npos || end == std::string::npos) { + return prompt; + } + auto pre = prompt.substr(0, begin); + auto post = prompt.substr(end + strlen(IMG_BASE64_TAG_END)); + return pre + replacement + post; +} + +struct llava_context { + struct clip_ctx * ctx_clip = NULL; + struct llama_context * ctx_llama = NULL; + struct llama_model * model = NULL; +}; + +static void print_usage(int, char ** argv) { + LOG("\n example usage:\n"); + LOG("\n %s -m --mmproj --image --image [--temp 0.1] [-p \"describe the image in detail.\"]\n", argv[0]); + LOG("\n note: a lower temperature value like 0.1 is recommended for better quality.\n"); +} + +static struct llava_image_embed * load_image(llava_context * ctx_llava, common_params * params, const std::string & fname) { + + // load and preprocess the image + llava_image_embed * embed = NULL; + auto prompt = params->prompt; + if (prompt_contains_image(prompt)) { + if (!params->image.empty()) { + LOG_INF("using base64 encoded image instead of command line image path\n"); + } + embed = llava_image_embed_make_with_prompt_base64(ctx_llava->ctx_clip, params->cpuparams.n_threads, prompt); + if (!embed) { + LOG_ERR("%s: can't load image from prompt\n", __func__); + return NULL; + } + params->prompt = remove_image_from_prompt(prompt); + } else { + embed = llava_image_embed_make_with_filename(ctx_llava->ctx_clip, params->cpuparams.n_threads, fname.c_str()); + if (!embed) { + fprintf(stderr, "%s: is %s really an image file?\n", __func__, fname.c_str()); + return NULL; + } + } + + return embed; +} + +static void process_prompt(struct llava_context * ctx_llava, struct llava_image_embed * image_embed, common_params * params, const std::string & prompt) { + int n_past = 0; + int cur_pos_id = 0; + + const int max_tgt_len = params->n_predict < 0 ? 256 : params->n_predict; + + std::string system_prompt, user_prompt; + size_t image_pos = prompt.find("<|vision_start|>"); + if (image_pos != std::string::npos) { + // new templating mode: Provide the full prompt including system message and use as a placeholder for the image + system_prompt = prompt.substr(0, image_pos); + user_prompt = prompt.substr(image_pos + std::string("<|vision_pad|>").length()); + LOG_INF("system_prompt: %s\n", system_prompt.c_str()); + if (params->verbose_prompt) { + auto tmp = common_tokenize(ctx_llava->ctx_llama, system_prompt, true, true); + for (int i = 0; i < (int) tmp.size(); i++) { + LOG_INF("%6d -> '%s'\n", tmp[i], common_token_to_piece(ctx_llava->ctx_llama, tmp[i]).c_str()); + } + } + LOG_INF("user_prompt: %s\n", user_prompt.c_str()); + if (params->verbose_prompt) { + auto tmp = common_tokenize(ctx_llava->ctx_llama, user_prompt, true, true); + for (int i = 0; i < (int) tmp.size(); i++) { + LOG_INF("%6d -> '%s'\n", tmp[i], common_token_to_piece(ctx_llava->ctx_llama, tmp[i]).c_str()); + } + } + } else { + // llava-1.5 native mode + system_prompt = "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n<|vision_start|>"; + user_prompt = "<|vision_end|>" + prompt + "<|im_end|>\n<|im_start|>assistant\n"; + if (params->verbose_prompt) { + auto tmp = common_tokenize(ctx_llava->ctx_llama, user_prompt, true, true); + for (int i = 0; i < (int) tmp.size(); i++) { + LOG_INF("%6d -> '%s'\n", tmp[i], common_token_to_piece(ctx_llava->ctx_llama, tmp[i]).c_str()); + } + } + } + + eval_string(ctx_llava->ctx_llama, system_prompt.c_str(), params->n_batch, &n_past, &cur_pos_id, true); + if (image_embed != nullptr) { + auto image_size = clip_get_load_image_size(ctx_llava->ctx_clip); + qwen2vl_eval_image_embed(ctx_llava->ctx_llama, image_embed, params->n_batch, &n_past, &cur_pos_id, image_size); + } + eval_string(ctx_llava->ctx_llama, user_prompt.c_str(), params->n_batch, &n_past, &cur_pos_id, false); + + // generate the response + + LOG("\n"); + + struct common_sampler * smpl = common_sampler_init(ctx_llava->model, params->sampling); + if (!smpl) { + LOG_ERR("%s: failed to initialize sampling subsystem\n", __func__); + exit(1); + } + + std::string response = ""; + for (int i = 0; i < max_tgt_len; i++) { + const char * tmp = sample(smpl, ctx_llava->ctx_llama, &n_past, &cur_pos_id); + response += tmp; + if (strcmp(tmp, "") == 0) break; + if (strstr(tmp, "###")) break; // Yi-VL behavior + LOG("%s", tmp); + if (strstr(response.c_str(), "<|im_end|>")) break; // Yi-34B llava-1.6 - for some reason those decode not as the correct token (tokenizer works) + if (strstr(response.c_str(), "<|im_start|>")) break; // Yi-34B llava-1.6 + if (strstr(response.c_str(), "USER:")) break; // mistral llava-1.6 + + fflush(stdout); + } + + common_sampler_free(smpl); + LOG("\n"); +} + +static struct llama_model * llava_init(common_params * params) { + llama_backend_init(); + llama_numa_init(params->numa); + + llama_model_params model_params = common_model_params_to_llama(*params); + + llama_model * model = llama_load_model_from_file(params->model.c_str(), model_params); + if (model == NULL) { + LOG_ERR("%s: unable to load model\n" , __func__); + return NULL; + } + return model; +} + +static struct llava_context * llava_init_context(common_params * params, llama_model * model) { + const char * clip_path = params->mmproj.c_str(); + + auto prompt = params->prompt; + if (prompt.empty()) { + prompt = "describe the image in detail."; + } + + auto ctx_clip = clip_model_load(clip_path, /*verbosity=*/ 1); + + + llama_context_params ctx_params = common_context_params_to_llama(*params); + ctx_params.n_ctx = params->n_ctx < 2048 ? 2048 : params->n_ctx; // we need a longer context size to process image embeddings + + llama_context * ctx_llama = llama_new_context_with_model(model, ctx_params); + + if (ctx_llama == NULL) { + LOG_ERR("%s: failed to create the llama_context\n" , __func__); + return NULL; + } + + auto * ctx_llava = (struct llava_context *)malloc(sizeof(llava_context)); + + ctx_llava->ctx_llama = ctx_llama; + ctx_llava->ctx_clip = ctx_clip; + ctx_llava->model = model; + return ctx_llava; +} + +static void llava_free(struct llava_context * ctx_llava) { + if (ctx_llava->ctx_clip) { + clip_free(ctx_llava->ctx_clip); + ctx_llava->ctx_clip = NULL; + } + + llama_free(ctx_llava->ctx_llama); + llama_free_model(ctx_llava->model); + llama_backend_free(); +} + +#ifndef NDEBUG + +static void debug_test_mrope_2d() { + // 1. Initialize backend + ggml_backend_t backend = NULL; + std::string backend_name = ""; +#ifdef GGML_USE_CUDA + fprintf(stderr, "%s: using CUDA backend\n", __func__); + backend = ggml_backend_cuda_init(0); // init device 0 + backend_name = "cuda"; + if (!backend) { + fprintf(stderr, "%s: ggml_backend_cuda_init() failed\n", __func__); + } +#endif + // if there aren't GPU Backends fallback to CPU backend + if (!backend) { + backend = ggml_backend_cpu_init(); + backend_name = "cpu"; + } + + // Calculate the size needed to allocate + size_t ctx_size = 0; + ctx_size += 2 * ggml_tensor_overhead(); // tensors + // no need to allocate anything else! + + // 2. Allocate `ggml_context` to store tensor data + struct ggml_init_params params = { + /*.mem_size =*/ ctx_size, + /*.mem_buffer =*/ NULL, + /*.no_alloc =*/ true, // the tensors will be allocated later by ggml_backend_alloc_ctx_tensors() + }; + struct ggml_context * ctx = ggml_init(params); + + struct ggml_tensor * inp_raw = ggml_new_tensor_3d(ctx, GGML_TYPE_F32, 128, 12, 30); + ggml_set_name(inp_raw, "inp_raw"); + ggml_set_input(inp_raw); + + struct ggml_tensor * pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, 30 * 4); + ggml_set_name(pos, "pos"); + ggml_set_input(pos); + + std::vector dummy_q; + dummy_q.resize(128 * 12 * 30); + std::fill(dummy_q.begin(), dummy_q.end(), 0.1); + // memcpy(inp_raw->data, dummy_q.data(), 128 * 12 * 30 * ggml_element_size(inp_raw)); + + std::vector pos_id; + pos_id.resize(30 * 4); + for (int i = 0; i < 30; i ++) { + pos_id[i] = i; + pos_id[i + 30] = i + 10; + pos_id[i + 60] = i + 20; + pos_id[i + 90] = i + 30; + } + int sections[4] = {32, 32, 0, 0}; + + // 4. Allocate a `ggml_backend_buffer` to store all tensors + ggml_backend_buffer_t buffer = ggml_backend_alloc_ctx_tensors(ctx, backend); + + // 5. Copy tensor data from main memory (RAM) to backend buffer + ggml_backend_tensor_set(inp_raw, dummy_q.data(), 0, ggml_nbytes(inp_raw)); + ggml_backend_tensor_set(pos, pos_id.data(), 0, ggml_nbytes(pos)); + + // 6. Create a `ggml_cgraph` for mul_mat operation + struct ggml_cgraph * gf = NULL; + struct ggml_context * ctx_cgraph = NULL; + + // create a temporally context to build the graph + struct ggml_init_params params0 = { + /*.mem_size =*/ ggml_tensor_overhead()*GGML_DEFAULT_GRAPH_SIZE + ggml_graph_overhead(), + /*.mem_buffer =*/ NULL, + /*.no_alloc =*/ true, // the tensors will be allocated later by ggml_gallocr_alloc_graph() + }; + ctx_cgraph = ggml_init(params0); + gf = ggml_new_graph(ctx_cgraph); + + struct ggml_tensor * result0 = ggml_rope_multi( + ctx_cgraph, inp_raw, pos, nullptr, + 128/2, sections, LLAMA_ROPE_TYPE_VISION, 32768, 1000000, 1, + 0, 1, 32, 1); + + // Add "result" tensor and all of its dependencies to the cgraph + ggml_build_forward_expand(gf, result0); + + // 7. Create a `ggml_gallocr` for cgraph computation + ggml_gallocr_t allocr = ggml_gallocr_new(ggml_backend_get_default_buffer_type(backend)); + ggml_gallocr_alloc_graph(allocr, gf); + + // 9. Run the computation + int n_threads = 1; // Optional: number of threads to perform some operations with multi-threading + if (ggml_backend_is_cpu(backend)) { + ggml_backend_cpu_set_n_threads(backend, n_threads); + } + ggml_backend_graph_compute(backend, gf); + + // 10. Retrieve results (output tensors) + // in this example, output tensor is always the last tensor in the graph + struct ggml_tensor * result = result0; + // struct ggml_tensor * result = gf->nodes[gf->n_nodes - 1]; + float * result_data = (float *)malloc(ggml_nbytes(result)); + // because the tensor data is stored in device buffer, we need to copy it back to RAM + ggml_backend_tensor_get(result, result_data, 0, ggml_nbytes(result)); + const std::string bin_file = "mrope_2d_" + backend_name +".bin"; + std::ofstream outFile(bin_file, std::ios::binary); + + if (outFile.is_open()) { + outFile.write(reinterpret_cast(result_data), ggml_nbytes(result)); + outFile.close(); + std::cout << "Data successfully written to " + bin_file << std::endl; + } else { + std::cerr << "Error opening file!" << std::endl; + } + + free(result_data); + // 11. Free memory and exit + ggml_free(ctx_cgraph); + ggml_gallocr_free(allocr); + ggml_free(ctx); + ggml_backend_buffer_free(buffer); + ggml_backend_free(backend); +} + +static void debug_dump_img_embed(struct llava_context * ctx_llava) { + int n_embd = llama_n_embd(llama_get_model(ctx_llava->ctx_llama)); + int ne = n_embd * 4; + float vals[56 * 56 * 3]; + // float embd[ne]; + std::vector embd; + embd.resize(ne); + + for (int i = 0; i < 56*56; i++) + { + for (int c = 0; c < 3; c++) + vals[i * 3 + c] = (float)(i % (56 * 56)) / (56*56); + } + + clip_encode_float_image(ctx_llava->ctx_clip, 16, vals, 56, 56, embd.data()); + + std::ofstream outFile("img_embed.bin", std::ios::binary); + if (outFile.is_open()) { + outFile.write(reinterpret_cast(embd.data()), ne * sizeof(float)); + + outFile.close(); + std::cout << "Data successfully written to mrope.bin" << std::endl; + } else { + std::cerr << "Error opening file!" << std::endl; + } +} + +#endif + + +int main(int argc, char ** argv) { + ggml_time_init(); + + common_params params; + + if (!common_params_parse(argc, argv, params, LLAMA_EXAMPLE_LLAVA, print_usage)) { + return 1; + } + + common_init(); + + if (params.mmproj.empty() || (params.image.empty() && !prompt_contains_image(params.prompt))) { + print_usage(argc, argv); + return 1; + } + + auto * model = llava_init(¶ms); + if (model == NULL) { + fprintf(stderr, "%s: error: failed to init llava model\n", __func__); + return 1; + } + + if (prompt_contains_image(params.prompt)) { + auto * ctx_llava = llava_init_context(¶ms, model); + + auto * image_embed = load_image(ctx_llava, ¶ms, ""); + + // process the prompt + process_prompt(ctx_llava, image_embed, ¶ms, params.prompt); + + llama_perf_context_print(ctx_llava->ctx_llama); + llava_image_embed_free(image_embed); + ctx_llava->model = NULL; + llava_free(ctx_llava); +#ifndef NDEBUG + } else if (params.image[0].empty()) { + auto ctx_llava = llava_init_context(¶ms, model); + + debug_test_mrope_2d(); + debug_dump_img_embed(ctx_llava); + + llama_perf_context_print(ctx_llava->ctx_llama); + ctx_llava->model = NULL; + llava_free(ctx_llava); +#endif + } else { + for (auto & image : params.image) { + auto * ctx_llava = llava_init_context(¶ms, model); + + auto * image_embed = load_image(ctx_llava, ¶ms, image); + if (!image_embed) { + LOG_ERR("%s: failed to load image %s. Terminating\n\n", __func__, image.c_str()); + return 1; + } + + // process the prompt + process_prompt(ctx_llava, image_embed, ¶ms, params.prompt); + + llama_perf_context_print(ctx_llava->ctx_llama); + llava_image_embed_free(image_embed); + ctx_llava->model = NULL; + llava_free(ctx_llava); + } + } + + llama_free_model(model); + + return 0; +} diff --git a/ggml/include/ggml.h b/ggml/include/ggml.h index 386d5a15d..b0c1ac9ce 100644 --- a/ggml/include/ggml.h +++ b/ggml/include/ggml.h @@ -237,7 +237,9 @@ #define GGML_EXIT_SUCCESS 0 #define GGML_EXIT_ABORTED 1 -#define GGML_ROPE_TYPE_NEOX 2 +#define GGML_ROPE_TYPE_NEOX 2 +#define GGML_ROPE_TYPE_MROPE 8 +#define GGML_ROPE_TYPE_VISION 24 #define GGUF_MAGIC "GGUF" @@ -1443,6 +1445,22 @@ extern "C" { float beta_fast, float beta_slow); + GGML_API struct ggml_tensor * ggml_rope_multi( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + struct ggml_tensor * c, + int n_dims, + int sections[4], + int mode, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow); + // in-place, returns view(a) GGML_API struct ggml_tensor * ggml_rope_ext_inplace( struct ggml_context * ctx, diff --git a/ggml/src/ggml-cann/ggml-cann.cpp b/ggml/src/ggml-cann/ggml-cann.cpp index fa04ab84f..d410c0244 100644 --- a/ggml/src/ggml-cann/ggml-cann.cpp +++ b/ggml/src/ggml-cann/ggml-cann.cpp @@ -1747,6 +1747,15 @@ static bool ggml_backend_cann_supports_op(ggml_backend_dev_t dev, if (*ext_factor != 0) { return false; } + + const int mode = ((const int32_t *) op->op_params)[2]; + if (mode & GGML_ROPE_TYPE_MROPE) { + return false; + } + if (mode & GGML_ROPE_TYPE_VISION) { + return false; + } + return true; } case GGML_OP_UPSCALE: { diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 92df6fdda..67e67a089 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -9133,6 +9133,64 @@ static void ggml_rope_cache_init( } } +static void ggml_mrope_cache_init( + float theta_base_t, float theta_base_h, float theta_base_w, float theta_base_e, int sections[4], bool indep_sects, + float freq_scale, const float * freq_factors, float corr_dims[2], int64_t ne0, float ext_factor, float mscale, + float * cache, float sin_sign, float theta_scale) { + // ref: https://github.com/jquesnelle/yarn/blob/master/scaled_rope/LlamaYaRNScaledRotaryEmbedding.py + float theta_t = theta_base_t; + float theta_h = theta_base_h; + float theta_w = theta_base_w; + float theta_e = theta_base_e; // extra position id for vision encoder + int sect_dims = sections[0] + sections[1] + sections[2] + sections[3]; + int sec_w = sections[1] + sections[0]; + int sec_e = sections[2] + sec_w; + GGML_ASSERT(sect_dims <= ne0); + + for (int64_t i0 = 0; i0 < ne0; i0 += 2) { + const float ff = freq_factors ? freq_factors[i0/2] : 1.0f; + + int sector = (i0 / 2) % sect_dims; + if (indep_sects) { + // compute theta independently for each dim sections + // (i.e. reset corresponding theta when `i0` go from one section to another) + if (sector == 0) { + theta_t = theta_base_t; + } + else if (sector == sections[0]) { + theta_h = theta_base_h;; + } + else if (sector == sec_w) { + theta_w = theta_base_w; + } + else if (sector == sec_e) { + theta_e = theta_base_e; + } + } + + float theta = theta_t; + if (sector >= sections[0] && sector < sec_w) { + theta = theta_h; + } + else if (sector >= sec_w && sector < sec_w + sections[2]) { + theta = theta_w; + } + else if (sector >= sec_w + sections[2]) { + theta = theta_e; + } + + rope_yarn( + theta/ff, freq_scale, corr_dims, i0, ext_factor, mscale, &cache[i0 + 0], &cache[i0 + 1] + ); + cache[i0 + 1] *= sin_sign; + + theta_t *= theta_scale; + theta_w *= theta_scale; + theta_h *= theta_scale; + theta_e *= theta_scale; + } +} + static void ggml_compute_forward_rope_f32( const struct ggml_compute_params * params, struct ggml_tensor * dst, @@ -9143,6 +9201,7 @@ static void ggml_compute_forward_rope_f32( const struct ggml_tensor * src2 = dst->src[2]; float freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow; + int sections[4]; //const int n_past = ((int32_t *) dst->op_params)[0]; const int n_dims = ((int32_t *) dst->op_params)[1]; @@ -9156,6 +9215,7 @@ static void ggml_compute_forward_rope_f32( memcpy(&attn_factor, (int32_t *) dst->op_params + 8, sizeof(float)); memcpy(&beta_fast, (int32_t *) dst->op_params + 9, sizeof(float)); memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); + memcpy(§ions, (int32_t *) dst->op_params + 11, sizeof(int)*4); GGML_TENSOR_UNARY_OP_LOCALS @@ -9188,6 +9248,16 @@ static void ggml_compute_forward_rope_f32( ggml_rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims); const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; + const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; // ggml_rope_multi, multimodal rotary position embedding + const bool is_vision = mode == GGML_ROPE_TYPE_VISION; + + if (is_mrope) { + GGML_ASSERT(sections[0] > 0 || sections[1] > 0 || sections[2] > 0); + } + + if (is_vision) { + GGML_ASSERT(n_dims == ne0/2); + } const float * freq_factors = NULL; if (src2 != NULL) { @@ -9203,18 +9273,63 @@ static void ggml_compute_forward_rope_f32( const int32_t * pos = (const int32_t *) src1->data; - for (int64_t i3 = 0; i3 < ne3; i3++) { - for (int64_t i2 = 0; i2 < ne2; i2++) { - const int64_t p = pos[i2]; + for (int64_t i3 = 0; i3 < ne3; i3++) { // batch + for (int64_t i2 = 0; i2 < ne2; i2++) { // seq-len float * cache = (float *) params->wdata + (ne0 + CACHE_LINE_SIZE_F32)*ith; - ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + if (!is_mrope) { + const int64_t p = pos[i2]; + ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + } + else { + const int64_t p_t = pos[i2]; + const int64_t p_h = pos[i2 + ne2]; + const int64_t p_w = pos[i2 + ne2 * 2]; + const int64_t p_e = pos[i2 + ne2 * 3]; + ggml_mrope_cache_init( + p_t, p_h, p_w, p_e, sections, is_vision, + freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + } - for (int64_t i1 = 0; i1 < ne1; i1++) { + for (int64_t i1 = 0; i1 < ne1; i1++) { // attn-heads if (ir++ < ir0) continue; if (ir > ir1) break; - if (!is_neox) { + if (is_neox || is_mrope) { + if (is_vision){ + for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + const int64_t ic = i0/2; + + const float cos_theta = cache[i0 + 0]; + const float sin_theta = cache[i0 + 1]; + + const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = src[0]; + const float x1 = src[n_dims]; + + dst_data[0] = x0*cos_theta - x1*sin_theta; + dst_data[n_dims] = x0*sin_theta + x1*cos_theta; + } + } else { + for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + const int64_t ic = i0/2; + + const float cos_theta = cache[i0 + 0]; + const float sin_theta = cache[i0 + 1]; + + const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = src[0]; + const float x1 = src[n_dims/2]; + + dst_data[0] = x0*cos_theta - x1*sin_theta; + dst_data[n_dims/2] = x0*sin_theta + x1*cos_theta; + } + } + } else { for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { const float cos_theta = cache[i0 + 0]; const float sin_theta = cache[i0 + 1]; @@ -9228,8 +9343,10 @@ static void ggml_compute_forward_rope_f32( dst_data[0] = x0*cos_theta - x1*sin_theta; dst_data[1] = x0*sin_theta + x1*cos_theta; } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + } + + if (is_vision) { + for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { const int64_t ic = i0/2; const float cos_theta = cache[i0 + 0]; @@ -9239,19 +9356,20 @@ static void ggml_compute_forward_rope_f32( float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); const float x0 = src[0]; - const float x1 = src[n_dims/2]; + const float x1 = src[n_dims]; - dst_data[0] = x0*cos_theta - x1*sin_theta; - dst_data[n_dims/2] = x0*sin_theta + x1*cos_theta; + dst_data[0] = x0*cos_theta - x1*sin_theta; + dst_data[n_dims] = x0*sin_theta + x1*cos_theta; } - } + } else { + // fill the remain channels with data from src tensor + for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { + const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - - dst_data[0] = src[0]; - dst_data[1] = src[1]; + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } } } } @@ -9269,6 +9387,7 @@ static void ggml_compute_forward_rope_f16( const struct ggml_tensor * src2 = dst->src[2]; float freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow; + int sections[4]; //const int n_past = ((int32_t *) dst->op_params)[0]; const int n_dims = ((int32_t *) dst->op_params)[1]; @@ -9281,6 +9400,8 @@ static void ggml_compute_forward_rope_f16( memcpy(&attn_factor, (int32_t *) dst->op_params + 8, sizeof(float)); memcpy(&beta_fast, (int32_t *) dst->op_params + 9, sizeof(float)); memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); + memcpy(§ions, (int32_t *) dst->op_params + 11, sizeof(int)*4); + GGML_TENSOR_UNARY_OP_LOCALS @@ -9313,6 +9434,16 @@ static void ggml_compute_forward_rope_f16( ggml_rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims); const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; + const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_vision = mode == GGML_ROPE_TYPE_VISION; + + if (is_mrope) { + GGML_ASSERT(sections[0] > 0 || sections[1] > 0 || sections[2] > 0); + } + + if (is_vision) { + GGML_ASSERT(n_dims == ne0/2); + } const float * freq_factors = NULL; if (src2 != NULL) { @@ -9330,16 +9461,61 @@ static void ggml_compute_forward_rope_f16( for (int64_t i3 = 0; i3 < ne3; i3++) { for (int64_t i2 = 0; i2 < ne2; i2++) { - const int64_t p = pos[i2]; float * cache = (float *) params->wdata + (ne0 + CACHE_LINE_SIZE_F32)*ith; - ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + if (!is_mrope) { + const int64_t p = pos[i2]; + ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + } + else { + const int64_t p_t = pos[i2]; + const int64_t p_h = pos[i2 + ne2]; + const int64_t p_w = pos[i2 + ne2 * 2]; + const int64_t p_e = pos[i2 + ne2 * 3]; + ggml_mrope_cache_init( + p_t, p_h, p_w, p_e, sections, is_vision, + freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); + } for (int64_t i1 = 0; i1 < ne1; i1++) { if (ir++ < ir0) continue; if (ir > ir1) break; - if (!is_neox) { + if (is_neox || is_mrope) { + if (is_vision) { + for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + const int64_t ic = i0/2; + + const float cos_theta = cache[i0 + 0]; + const float sin_theta = cache[i0 + 1]; + + const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = GGML_FP16_TO_FP32(src[0]); + const float x1 = GGML_FP16_TO_FP32(src[n_dims]); + + dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); + dst_data[n_dims] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); + } + } else { + for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + const int64_t ic = i0/2; + + const float cos_theta = cache[i0 + 0]; + const float sin_theta = cache[i0 + 1]; + + const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); + ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); + + const float x0 = GGML_FP16_TO_FP32(src[0]); + const float x1 = GGML_FP16_TO_FP32(src[n_dims/2]); + + dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); + dst_data[n_dims/2] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); + } + } + } else { for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { const float cos_theta = cache[i0 + 0]; const float sin_theta = cache[i0 + 1]; @@ -9353,8 +9529,10 @@ static void ggml_compute_forward_rope_f16( dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); dst_data[1] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { + } + + if (is_vision) { + for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { const int64_t ic = i0/2; const float cos_theta = cache[i0 + 0]; @@ -9364,19 +9542,19 @@ static void ggml_compute_forward_rope_f16( ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); const float x0 = GGML_FP16_TO_FP32(src[0]); - const float x1 = GGML_FP16_TO_FP32(src[n_dims/2]); + const float x1 = GGML_FP16_TO_FP32(src[n_dims]); - dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); - dst_data[n_dims/2] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); + dst_data[0] = GGML_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); + dst_data[n_dims] = GGML_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); } - } + } else { + for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { + const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - - dst_data[0] = src[0]; - dst_data[1] = src[1]; + dst_data[0] = src[0]; + dst_data[1] = src[1]; + } } } } diff --git a/ggml/src/ggml-cuda/rope.cu b/ggml/src/ggml-cuda/rope.cu index 88f586d68..2c84778d2 100644 --- a/ggml/src/ggml-cuda/rope.cu +++ b/ggml/src/ggml-cuda/rope.cu @@ -4,6 +4,11 @@ struct rope_corr_dims { float v[2]; }; + +struct mrope_sections { + int v[4]; +}; + static __device__ float rope_yarn_ramp(const float low, const float high, const int i0) { const float y = (i0 / 2 - low) / max(0.001f, high - low); return 1.0f - min(1.0f, max(0.0f, y)); @@ -108,6 +113,105 @@ static __global__ void rope_neox( dst[i + n_dims/2] = x0*sin_theta + x1*cos_theta; } +template +static __global__ void rope_multi( + const T * x, T * dst, int ne0, int ne2, int n_dims, const int32_t * pos, float freq_scale, int p_delta_rows, + float ext_factor, float attn_factor, rope_corr_dims corr_dims, float theta_scale, const float * freq_factors, mrope_sections sections) { + const int i0 = 2*(blockDim.y*blockIdx.y + threadIdx.y); + + if (i0 >= ne0) { + return; + } + + const int row = blockDim.x*blockIdx.x + threadIdx.x; + + if (i0 >= n_dims) { + const int i = row*ne0 + i0; + + dst[i + 0] = x[i + 0]; + dst[i + 1] = x[i + 1]; + + return; + } + + const int i = row*ne0 + i0/2; + const int i2 = row/p_delta_rows; + + int sect_dims = sections.v[0] + sections.v[1] + sections.v[2] + sections.v[3]; + int sec_w = sections.v[1] + sections.v[0]; + int sector = (i0 / 2) % sect_dims; + + float theta_base = 0.0; + if (sector < sections.v[0]) { + theta_base = pos[i2]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sections.v[0] && sector < sec_w) { + theta_base = pos[i2 + ne2 * 1]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sec_w && sector < sec_w + sections.v[2]) { + theta_base = pos[i2 + ne2 * 2]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sec_w + sections.v[2]) { + theta_base = pos[i2 + ne2 * 3]*powf(theta_scale, i0/2.0f); + } + + const float freq_factor = has_ff ? freq_factors[i0/2] : 1.0f; + + float cos_theta; + float sin_theta; + + rope_yarn(theta_base/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor, &cos_theta, &sin_theta); + + const float x0 = x[i + 0]; + const float x1 = x[i + n_dims/2]; + + dst[i + 0] = x0*cos_theta - x1*sin_theta; + dst[i + n_dims/2] = x0*sin_theta + x1*cos_theta; +} + +template +static __global__ void rope_vision( + const T * x, T * dst, int ne0, int ne2, int n_dims, const int32_t * pos, float freq_scale, int p_delta_rows, + float ext_factor, float attn_factor, rope_corr_dims corr_dims, float theta_scale, const float * freq_factors, mrope_sections sections) { + const int i0 = 2*(blockDim.y*blockIdx.y + threadIdx.y); + + if (i0 >= ne0) { + return; + } + + const int row = blockDim.x*blockIdx.x + threadIdx.x; + + const int i = row*ne0 + i0/2; + const int i2 = row/p_delta_rows; // i2-th tokens + + int sect_dims = sections.v[0] + sections.v[1]; + int sec_w = sections.v[1] + sections.v[0]; + int sector = (i0 / 2) % sect_dims; + + float theta_base = 0.0; + if (sector < sections.v[0]) { + const int p = sector; + theta_base = pos[i2]*powf(theta_scale, p); + } + else if (sector >= sections.v[0] && sector < sec_w) { + const int p = sector - sections.v[0]; + theta_base = pos[i2 + ne2]*powf(theta_scale, p); + } + + const float freq_factor = has_ff ? freq_factors[i0/2] : 1.0f; + + float cos_theta; + float sin_theta; + + rope_yarn(theta_base/freq_factor, freq_scale, corr_dims, i0, ext_factor, attn_factor, &cos_theta, &sin_theta); + + const float x0 = x[i + 0]; + const float x1 = x[i + n_dims]; + + dst[i + 0] = x0*cos_theta - x1*sin_theta; + dst[i + n_dims] = x0*sin_theta + x1*cos_theta; +} + template static void rope_norm_cuda( const T * x, T * dst, int ne0, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, @@ -156,6 +260,56 @@ static void rope_neox_cuda( } } +template +static void rope_multi_cuda( + const T * x, T * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream) { + GGML_ASSERT(ne0 % 2 == 0); + const dim3 block_dims(1, CUDA_ROPE_BLOCK_SIZE, 1); + const int n_blocks_x = (ne0 + 2*CUDA_ROPE_BLOCK_SIZE - 1) / (2*CUDA_ROPE_BLOCK_SIZE); + const dim3 block_nums(nr, n_blocks_x, 1); + + const float theta_scale = powf(freq_base, -2.0f/n_dims); + + if (freq_factors == nullptr) { + rope_multi<<>>( + x, dst, ne0, ne2, n_dims, pos, freq_scale, p_delta_rows, ext_factor, attn_factor, corr_dims, + theta_scale, freq_factors, sections + ); + } else { + rope_multi<<>>( + x, dst, ne0, ne2, n_dims, pos, freq_scale, p_delta_rows, ext_factor, attn_factor, corr_dims, + theta_scale, freq_factors, sections + ); + } +} + +template +static void rope_vision_cuda( + const T * x, T * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream) { + GGML_ASSERT(ne0 % 2 == 0); + const dim3 block_dims(1, CUDA_ROPE_BLOCK_SIZE, 1); + const int n_blocks_x = (ne0 + 2*CUDA_ROPE_BLOCK_SIZE - 1) / (2*CUDA_ROPE_BLOCK_SIZE); + const dim3 block_nums(nr, n_blocks_x, 1); + // break down (head_dim, heads, seq) into (CUDA_ROPE_BLOCK_SIZE, x, heads * seq) + // where x ~= ceil(head_dim / CUDA_ROPE_BLOCK_SIZE); + + const float theta_scale = powf(freq_base, -2.0f/n_dims); + + if (freq_factors == nullptr) { + rope_vision<<>>( + x, dst, ne0, ne2, n_dims, pos, freq_scale, p_delta_rows, ext_factor, attn_factor, corr_dims, + theta_scale, freq_factors, sections + ); + } else { + rope_vision<<>>( + x, dst, ne0, ne2, n_dims, pos, freq_scale, p_delta_rows, ext_factor, attn_factor, corr_dims, + theta_scale, freq_factors, sections + ); + } +} + static void rope_norm_cuda_f16( const half * x, half * dst, int ne0, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, cudaStream_t stream) { @@ -185,6 +339,38 @@ static void rope_neox_cuda_f32( rope_neox_cuda(x, dst, ne0, n_dims, nr, pos, freq_scale, p_delta_rows, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, stream); } +static void rope_multi_cuda_f16( + const half * x, half * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream +) { + + rope_multi_cuda(x, dst, ne0, ne2, n_dims, nr, pos, freq_scale, p_delta_rows, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); +} + +static void rope_multi_cuda_f32( + const float * x, float * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream +) { + + rope_multi_cuda(x, dst, ne0, ne2, n_dims, nr, pos, freq_scale, p_delta_rows, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); +} + +static void rope_vision_cuda_f16( + const half * x, half * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream +) { + + rope_vision_cuda(x, dst, ne0, ne2, n_dims, nr, pos, freq_scale, p_delta_rows, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); +} + +static void rope_vision_cuda_f32( + const float * x, float * dst, int ne0, int ne2, int n_dims, int nr, const int32_t * pos, float freq_scale, int p_delta_rows, + float freq_base, float ext_factor, float attn_factor, rope_corr_dims corr_dims, const float * freq_factors, mrope_sections sections, cudaStream_t stream +) { + + rope_vision_cuda(x, dst, ne0, ne2, n_dims, nr, pos, freq_scale, p_delta_rows, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); +} + void ggml_cuda_op_rope(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const ggml_tensor * src0 = dst->src[0]; const ggml_tensor * src1 = dst->src[1]; @@ -201,8 +387,9 @@ void ggml_cuda_op_rope(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { GGML_ASSERT( dst->type == GGML_TYPE_F32 || dst->type == GGML_TYPE_F16); GGML_ASSERT(src0->type == dst->type); - const int64_t ne00 = src0->ne[0]; - const int64_t ne01 = src0->ne[1]; + const int64_t ne00 = src0->ne[0]; // head dims + const int64_t ne01 = src0->ne[1]; // num heads + const int64_t ne02 = src0->ne[2]; // num heads const int64_t nr = ggml_nrows(src0); //const int n_past = ((int32_t *) dst->op_params)[0]; @@ -210,6 +397,7 @@ void ggml_cuda_op_rope(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const int mode = ((int32_t *) dst->op_params)[2]; //const int n_ctx = ((int32_t *) dst->op_params)[3]; const int n_ctx_orig = ((int32_t *) dst->op_params)[4]; + mrope_sections sections; // RoPE alteration for extended context float freq_base; @@ -225,8 +413,19 @@ void ggml_cuda_op_rope(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { memcpy(&attn_factor, (int32_t *) dst->op_params + 8, sizeof(float)); memcpy(&beta_fast, (int32_t *) dst->op_params + 9, sizeof(float)); memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); + memcpy(§ions.v, (int32_t *) dst->op_params + 11, sizeof(int)*4); const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; + const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_vision = mode == GGML_ROPE_TYPE_VISION; + + if (is_mrope) { + GGML_ASSERT(sections.v[0] > 0 || sections.v[1] > 0 || sections.v[2] > 0); + } + + if (is_vision) { + GGML_ASSERT(n_dims == ne00/2); + } const int32_t * pos = (const int32_t *) src1_d; @@ -253,6 +452,34 @@ void ggml_cuda_op_rope(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { } else { GGML_ABORT("fatal error"); } + } else if (is_mrope && !is_vision) { + if (src0->type == GGML_TYPE_F32) { + rope_multi_cuda_f32( + (const float *)src0_d, (float *)dst_d, ne00, ne02, n_dims, nr, pos, freq_scale, ne01, freq_base, ext_factor, + attn_factor, corr_dims, freq_factors, sections, stream + ); + } else if (src0->type == GGML_TYPE_F16) { + rope_multi_cuda_f16( + (const half *)src0_d, (half *)dst_d, ne00, ne02, n_dims, nr, pos, freq_scale, ne01, freq_base, ext_factor, + attn_factor, corr_dims, freq_factors, sections, stream + ); + } else { + GGML_ABORT("fatal error"); + } + } else if (is_vision) { + if (src0->type == GGML_TYPE_F32) { + rope_vision_cuda_f32( + (const float *)src0_d, (float *)dst_d, ne00, ne02, n_dims, nr, pos, freq_scale, ne01, freq_base, ext_factor, + attn_factor, corr_dims, freq_factors, sections, stream + ); + } else if (src0->type == GGML_TYPE_F16) { + rope_vision_cuda_f16( + (const half *)src0_d, (half *)dst_d, ne00, ne02, n_dims, nr, pos, freq_scale, ne01, freq_base, ext_factor, + attn_factor, corr_dims, freq_factors, sections, stream + ); + } else { + GGML_ABORT("fatal error"); + } } else { if (src0->type == GGML_TYPE_F32) { rope_norm_cuda_f32( diff --git a/ggml/src/ggml-kompute/ggml-kompute.cpp b/ggml/src/ggml-kompute/ggml-kompute.cpp index 28ceecfc4..505792271 100644 --- a/ggml/src/ggml-kompute/ggml-kompute.cpp +++ b/ggml/src/ggml-kompute/ggml-kompute.cpp @@ -1419,8 +1419,18 @@ static bool ggml_backend_kompute_device_supports_op(ggml_backend_dev_t dev, cons case GGML_OP_SOFT_MAX: case GGML_OP_RMS_NORM: case GGML_OP_NORM: - case GGML_OP_ROPE: return true; + case GGML_OP_ROPE: + { + const int mode = ((const int32_t *) op->op_params)[2]; + if (mode & GGML_ROPE_TYPE_MROPE) { + return false; + } + if (mode & GGML_ROPE_TYPE_VISION) { + return false; + } + return true; + } case GGML_OP_DUP: case GGML_OP_CPY: case GGML_OP_CONT: diff --git a/ggml/src/ggml-metal/ggml-metal.m b/ggml/src/ggml-metal/ggml-metal.m index 34fe5778e..28f590f92 100644 --- a/ggml/src/ggml-metal/ggml-metal.m +++ b/ggml/src/ggml-metal/ggml-metal.m @@ -1125,8 +1125,18 @@ static bool ggml_metal_supports_op(const struct ggml_backend_metal_device_contex return has_simdgroup_reduction && (op->ne[0] % 4 == 0); case GGML_OP_ARGMAX: case GGML_OP_NORM: - case GGML_OP_ROPE: return true; + case GGML_OP_ROPE: + { + const int mode = ((const int32_t *) op->op_params)[2]; + if (mode & GGML_ROPE_TYPE_MROPE) { + return false; + } + if (mode & GGML_ROPE_TYPE_VISION) { + return false; + } + return true; + } case GGML_OP_IM2COL: return op->src[0]->type == GGML_TYPE_F16; case GGML_OP_POOL_1D: @@ -3026,7 +3036,9 @@ static void ggml_metal_encode_node( } break; case GGML_OP_ROPE: { - GGML_ASSERT(ne10 == ne02); + // make sure we have one or more position id(ne10) per token(ne02) + GGML_ASSERT(ne10 % ne02 == 0); + GGML_ASSERT(ne10 >= ne02); const int nth = MIN(1024, ne00); diff --git a/ggml/src/ggml-sycl/ggml-sycl.cpp b/ggml/src/ggml-sycl/ggml-sycl.cpp index 6b9f0b0d9..84f1328e7 100644 --- a/ggml/src/ggml-sycl/ggml-sycl.cpp +++ b/ggml/src/ggml-sycl/ggml-sycl.cpp @@ -4488,7 +4488,16 @@ static bool ggml_backend_sycl_device_supports_op(ggml_backend_dev_t dev, const g case GGML_OP_SOFT_MAX: return true; case GGML_OP_ROPE: - return ggml_is_contiguous(op->src[0]); + { + const int mode = ((const int32_t *) op->op_params)[2]; + if (mode & GGML_ROPE_TYPE_MROPE) { + return false; + } + if (mode & GGML_ROPE_TYPE_VISION) { + return false; + } + return ggml_is_contiguous(op->src[0]); + } case GGML_OP_IM2COL: // TODO: add support for the new F32 operations return op->src[0]->type == GGML_TYPE_F16; diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 515d66b39..a26a8fe09 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -7687,7 +7687,16 @@ static bool ggml_backend_vk_device_supports_op(ggml_backend_dev_t dev, const ggm case GGML_OP_REPEAT: return ggml_type_size(op->type) == sizeof(float) && ggml_type_size(op->src[0]->type) == sizeof(float); case GGML_OP_ROPE: - return ggml_is_contiguous(op->src[0]); + { + const int mode = ((const int32_t *) op->op_params)[2]; + if (mode & GGML_ROPE_TYPE_MROPE) { + return false; + } + if (mode & GGML_ROPE_TYPE_VISION) { + return false; + } + return ggml_is_contiguous(op->src[0]); + } case GGML_OP_NONE: case GGML_OP_RESHAPE: case GGML_OP_VIEW: diff --git a/ggml/src/ggml.c b/ggml/src/ggml.c index 058941c7a..51cc85662 100644 --- a/ggml/src/ggml.c +++ b/ggml/src/ggml.c @@ -3517,15 +3517,18 @@ static struct ggml_tensor * ggml_rope_impl( GGML_ASSERT(c->ne[0] >= n_dims / 2); } + int sections[4] = {0, 0, 0, 0}; + struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a); - int32_t params[11] = { /*n_past*/ 0, n_dims, mode, /*n_ctx*/ 0, n_ctx_orig }; + int32_t params[15] = { /*n_past*/ 0, n_dims, mode, /*n_ctx*/ 0, n_ctx_orig }; memcpy(params + 5, &freq_base, sizeof(float)); memcpy(params + 6, &freq_scale, sizeof(float)); memcpy(params + 7, &ext_factor, sizeof(float)); memcpy(params + 8, &attn_factor, sizeof(float)); memcpy(params + 9, &beta_fast, sizeof(float)); memcpy(params + 10, &beta_slow, sizeof(float)); + memcpy(params + 11, §ions, sizeof(int)*4); ggml_set_op_params(result, params, sizeof(params)); result->op = GGML_OP_ROPE; @@ -3547,6 +3550,53 @@ struct ggml_tensor * ggml_rope( ); } +struct ggml_tensor * ggml_rope_multi( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + struct ggml_tensor * c, + int n_dims, + int sections[4], + int mode, + int n_ctx_orig, + float freq_base, + float freq_scale, + float ext_factor, + float attn_factor, + float beta_fast, + float beta_slow) { + // Multimodal Rotary Position Embedding + GGML_ASSERT((mode & 1) == 0 && "mode & 1 == 1 is no longer supported"); + + GGML_ASSERT(ggml_is_vector(b)); + GGML_ASSERT(b->type == GGML_TYPE_I32); + GGML_ASSERT(a->ne[2] * 4 == b->ne[0]); // mrope expecting 4 position ids per token + + if (c) { + GGML_ASSERT(c->type == GGML_TYPE_F32); + GGML_ASSERT(c->ne[0] >= n_dims / 2); + } + + struct ggml_tensor * result = ggml_dup_tensor(ctx, a); + + int32_t params[11 + 4] = { /*n_past*/ 0, n_dims, mode, /*n_ctx*/ 0, n_ctx_orig }; + memcpy(params + 5, &freq_base, sizeof(float)); + memcpy(params + 6, &freq_scale, sizeof(float)); + memcpy(params + 7, &ext_factor, sizeof(float)); + memcpy(params + 8, &attn_factor, sizeof(float)); + memcpy(params + 9, &beta_fast, sizeof(float)); + memcpy(params + 10, &beta_slow, sizeof(float)); + memcpy(¶ms[11], sections, sizeof(int)*4); + ggml_set_op_params(result, params, sizeof(params)); + + result->op = GGML_OP_ROPE; + result->src[0] = a; + result->src[1] = b; + result->src[2] = c; + + return result; +} + struct ggml_tensor * ggml_rope_inplace( struct ggml_context * ctx, struct ggml_tensor * a, diff --git a/gguf-py/gguf/constants.py b/gguf-py/gguf/constants.py index 4c8710b39..0cf939429 100644 --- a/gguf-py/gguf/constants.py +++ b/gguf-py/gguf/constants.py @@ -131,6 +131,7 @@ class Keys: class Rope: DIMENSION_COUNT = "{arch}.rope.dimension_count" + DIMENSION_SECTIONS = "{arch}.rope.dimension_sections" FREQ_BASE = "{arch}.rope.freq_base" SCALING_TYPE = "{arch}.rope.scaling.type" SCALING_FACTOR = "{arch}.rope.scaling.factor" @@ -226,6 +227,7 @@ class MODEL_ARCH(IntEnum): QWEN = auto() QWEN2 = auto() QWEN2MOE = auto() + QWEN2VL = auto() PHI2 = auto() PHI3 = auto() PLAMO = auto() @@ -388,6 +390,7 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.QWEN: "qwen", MODEL_ARCH.QWEN2: "qwen2", MODEL_ARCH.QWEN2MOE: "qwen2moe", + MODEL_ARCH.QWEN2VL: "qwen2vl", MODEL_ARCH.PHI2: "phi2", MODEL_ARCH.PHI3: "phi3", MODEL_ARCH.PLAMO: "plamo", @@ -772,6 +775,20 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_DOWN, MODEL_TENSOR.FFN_UP, ], + MODEL_ARCH.QWEN2VL: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], MODEL_ARCH.QWEN2MOE: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.OUTPUT_NORM, diff --git a/gguf-py/gguf/gguf_writer.py b/gguf-py/gguf/gguf_writer.py index 7a55d1296..65a64e10d 100644 --- a/gguf-py/gguf/gguf_writer.py +++ b/gguf-py/gguf/gguf_writer.py @@ -751,6 +751,9 @@ class GGUFWriter: def add_rope_dimension_count(self, count: int) -> None: self.add_uint32(Keys.Rope.DIMENSION_COUNT.format(arch=self.arch), count) + def add_rope_dimension_sections(self, dims: Sequence[int]) -> None: + self.add_array(Keys.Rope.DIMENSION_SECTIONS.format(arch=self.arch), dims) + def add_rope_freq_base(self, value: float) -> None: self.add_float32(Keys.Rope.FREQ_BASE.format(arch=self.arch), value) diff --git a/include/llama.h b/include/llama.h index eebbacb80..c67988a33 100644 --- a/include/llama.h +++ b/include/llama.h @@ -108,9 +108,11 @@ extern "C" { }; enum llama_rope_type { - LLAMA_ROPE_TYPE_NONE = -1, - LLAMA_ROPE_TYPE_NORM = 0, - LLAMA_ROPE_TYPE_NEOX = GGML_ROPE_TYPE_NEOX, + LLAMA_ROPE_TYPE_NONE = -1, + LLAMA_ROPE_TYPE_NORM = 0, + LLAMA_ROPE_TYPE_NEOX = GGML_ROPE_TYPE_NEOX, + LLAMA_ROPE_TYPE_MROPE = GGML_ROPE_TYPE_MROPE, + LLAMA_ROPE_TYPE_VISION = GGML_ROPE_TYPE_VISION, }; enum llama_token_type { //TODO: remove, required until per token attributes are available from GGUF file diff --git a/src/llama.cpp b/src/llama.cpp index 49ef5b78a..abc1252e7 100644 --- a/src/llama.cpp +++ b/src/llama.cpp @@ -163,6 +163,7 @@ enum llm_arch { LLM_ARCH_QWEN, LLM_ARCH_QWEN2, LLM_ARCH_QWEN2MOE, + LLM_ARCH_QWEN2VL, LLM_ARCH_PHI2, LLM_ARCH_PHI3, LLM_ARCH_PLAMO, @@ -217,6 +218,7 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_QWEN, "qwen" }, { LLM_ARCH_QWEN2, "qwen2" }, { LLM_ARCH_QWEN2MOE, "qwen2moe" }, + { LLM_ARCH_QWEN2VL, "qwen2vl" }, { LLM_ARCH_PHI2, "phi2" }, { LLM_ARCH_PHI3, "phi3" }, { LLM_ARCH_PLAMO, "plamo" }, @@ -308,6 +310,7 @@ enum llm_kv { LLM_KV_ATTENTION_SCALE, LLM_KV_ROPE_DIMENSION_COUNT, + LLM_KV_ROPE_DIMENSION_SECTIONS, LLM_KV_ROPE_FREQ_BASE, LLM_KV_ROPE_SCALE_LINEAR, LLM_KV_ROPE_SCALING_TYPE, @@ -424,6 +427,7 @@ static const std::map LLM_KV_NAMES = { { LLM_KV_ATTENTION_SCALE, "%s.attention.scale" }, { LLM_KV_ROPE_DIMENSION_COUNT, "%s.rope.dimension_count" }, + { LLM_KV_ROPE_DIMENSION_SECTIONS, "%s.rope.dimension_sections" }, { LLM_KV_ROPE_FREQ_BASE, "%s.rope.freq_base" }, { LLM_KV_ROPE_SCALE_LINEAR, "%s.rope.scale_linear" }, { LLM_KV_ROPE_SCALING_TYPE, "%s.rope.scaling.type" }, @@ -898,6 +902,23 @@ static const std::map> LLM_TENSOR_N { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, }, }, + { + LLM_ARCH_QWEN2VL, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" }, + { LLM_TENSOR_ATTN_K, "blk.%d.attn_k" }, + { LLM_TENSOR_ATTN_V, "blk.%d.attn_v" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE, "blk.%d.ffn_gate" }, + { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" }, + { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, + }, + }, { LLM_ARCH_QWEN2MOE, { @@ -2474,11 +2495,12 @@ struct llama_hparams { uint32_t time_decay_extra_dim = 0; uint32_t wkv_head_size = 0; - float rope_attn_factor = 1.0f; - float rope_freq_base_train; - float rope_freq_scale_train; - uint32_t n_ctx_orig_yarn; - float rope_yarn_log_mul; + float rope_attn_factor = 1.0f; + float rope_freq_base_train; + float rope_freq_scale_train; + uint32_t n_ctx_orig_yarn; + float rope_yarn_log_mul; + int rope_sections[4]; // for State Space Models uint32_t ssm_d_conv = 0; @@ -2535,6 +2557,9 @@ struct llama_hparams { if (this->rope_finetuned != other.rope_finetuned) return true; if (this->n_ctx_orig_yarn != other.n_ctx_orig_yarn) return true; + if (std::equal(std::begin(this->rope_sections), + std::end(this->rope_sections), + std::begin(other.rope_sections))) return true; if (this->ssm_d_conv != other.ssm_d_conv) return true; if (this->ssm_d_inner != other.ssm_d_inner) return true; @@ -3378,6 +3403,11 @@ struct llama_context { // whether we are computing encoder output or decoder output bool is_encoding = false; + // TODO: find a better way to accommodate mutli-dimension position encoding methods + // number of position id each token get, 1 for each token in most cases. + // when using m-rope, it will be 3 position ids per token to representing 3 dimension coordinate. + int n_pos_per_token = 1; + // output of the encoder part of the encoder-decoder models std::vector embd_enc; std::vector> seq_ids_enc; @@ -5747,6 +5777,13 @@ static void llm_load_hparams( default: model.type = e_model::MODEL_UNKNOWN; } } break; + case LLM_ARCH_QWEN2VL: + { + std::array section_dims; + ml.get_key_or_arr(LLM_KV_ROPE_DIMENSION_SECTIONS, section_dims, 4, true); + std::copy(section_dims.begin(), section_dims.begin() + 4, std::begin(hparams.rope_sections)); + } + // fall through case LLM_ARCH_QWEN2: { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); @@ -8167,6 +8204,7 @@ static bool llm_load_tensors( } } break; case LLM_ARCH_QWEN2: + case LLM_ARCH_QWEN2VL: { model.tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); @@ -12556,6 +12594,124 @@ struct llm_build_context { return gf; } + struct ggml_cgraph * build_qwen2vl() { + struct ggml_cgraph * gf = ggml_new_graph_custom(ctx0, llama_model_max_nodes(model), false); + const int64_t n_embd_head = hparams.n_embd_head_v; + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + struct ggml_tensor * cur; + struct ggml_tensor * inpL; + + inpL = llm_build_inp_embd(ctx0, lctx, hparams, ubatch, model.tok_embd, cb); + + // inp_pos - contains the positions + lctx.inp_pos = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_tokens * 4); + cb(lctx.inp_pos, "inp_pos", -1); + ggml_set_input(lctx.inp_pos); + struct ggml_tensor * inp_pos = lctx.inp_pos; + + // KQ_mask (mask for 1 head, it will be broadcasted to all heads) + struct ggml_tensor * KQ_mask = build_inp_KQ_mask(); + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + for (int il = 0; il < n_layer; ++il) { + struct ggml_tensor * inpSA = inpL; + + // norm + cur = llm_build_norm(ctx0, inpL, hparams, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, cb, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + struct ggml_tensor * Qcur = llm_build_lora_mm(lctx, ctx0, model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + + struct ggml_tensor * Kcur = llm_build_lora_mm(lctx, ctx0, model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + + struct ggml_tensor * Vcur = llm_build_lora_mm(lctx, ctx0, model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + + Qcur = ggml_rope_multi( + ctx0, + ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens), inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(Qcur, "Qcur", il); + + Kcur = ggml_rope_multi( + ctx0, + ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens), inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(Kcur, "Kcur", il); + + cur = llm_build_kv(ctx0, lctx, kv_self, gf, + model.layers[il].wo, model.layers[il].bo, + Kcur, Vcur, Qcur, KQ_mask, n_tokens, kv_head, n_kv, 1.0f/sqrtf(float(n_embd_head)), cb, il); + } + + if (il == n_layer - 1) { + // skip computing output for unused tokens + struct ggml_tensor * inp_out_ids = build_inp_out_ids(); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + struct ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = llm_build_norm(ctx0, ffn_inp, hparams, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, cb, il); + cb(cur, "ffn_norm", il); + + cur = llm_build_ffn(ctx0, lctx, cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, cb, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cur = lctx.cvec.apply_to(ctx0, cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = llm_build_norm(ctx0, cur, hparams, + model.output_norm, NULL, + LLM_NORM_RMS, cb, -1); + cb(cur, "result_norm", -1); + + // lm_head + cur = llm_build_lora_mm(lctx, ctx0, model.output, cur); + cb(cur, "result_output", -1); + + ggml_build_forward_expand(gf, cur); + + return gf; + } + struct ggml_cgraph * build_qwen2moe() { struct ggml_cgraph * gf = ggml_new_graph_custom(ctx0, llama_model_max_nodes(model), false); @@ -16657,6 +16813,11 @@ static struct ggml_cgraph * llama_build_graph( { result = llm.build_qwen2(); } break; + case LLM_ARCH_QWEN2VL: + { + lctx.n_pos_per_token = 4; + result = llm.build_qwen2vl(); + } break; case LLM_ARCH_QWEN2MOE: { result = llm.build_qwen2moe(); @@ -16875,8 +17036,8 @@ static void llama_set_inputs(llama_context & lctx, const llama_ubatch & ubatch) if (ubatch.pos && lctx.inp_pos) { const int64_t n_tokens = ubatch.n_tokens; - - ggml_backend_tensor_set(lctx.inp_pos, ubatch.pos, 0, n_tokens*ggml_element_size(lctx.inp_pos)); + auto n_pos = lctx.n_pos_per_token; + ggml_backend_tensor_set(lctx.inp_pos, ubatch.pos, 0, n_tokens*n_pos*ggml_element_size(lctx.inp_pos)); } if (hparams.causal_attn || cparams.pooling_type == LLAMA_POOLING_TYPE_NONE) { @@ -20009,6 +20170,9 @@ enum llama_rope_type llama_rope_type(const struct llama_model * model) { case LLM_ARCH_MINICPM3: return LLAMA_ROPE_TYPE_NEOX; + case LLM_ARCH_QWEN2VL: + return LLAMA_ROPE_TYPE_MROPE; + // all model arches should be listed explicitly here case LLM_ARCH_UNKNOWN: GGML_ABORT("unknown architecture"); diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 9dd41260a..b9454ba59 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -2201,7 +2201,15 @@ struct test_rope : public test_case { ggml_set_name(a, "a"); } - ggml_tensor * pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne_a[2]); + const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_vision = mode == GGML_ROPE_TYPE_VISION; + + ggml_tensor * pos; + if (is_mrope || is_vision) { + pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne_a[2] * 4); + } else { + pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne_a[2]); + } ggml_set_name(pos, "pos"); ggml_tensor * freq = nullptr; @@ -2210,7 +2218,20 @@ struct test_rope : public test_case { ggml_set_name(freq, "freq"); } - ggml_tensor * out = ggml_rope_ext(ctx, a, pos, freq, n_dims, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f); + ggml_tensor * out; + if (is_mrope) { + if (is_vision) { + GGML_ASSERT(n_dims/4 > 0); + int rope_sections[4] = {n_dims/4, n_dims/4, 0, 0}; // Vision-RoPE only use first two dimension for image (x, y) coordinate + out = ggml_rope_multi(ctx, a, pos, freq, n_dims/2, rope_sections, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f); + } else { + GGML_ASSERT(n_dims/3 > 0); + int rope_sections[4] = {n_dims/3, n_dims/3, n_dims/3, 0}; + out = ggml_rope_multi(ctx, a, pos, freq, n_dims, rope_sections, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f); + } + } else { + out = ggml_rope_ext(ctx, a, pos, freq, n_dims, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f); + } ggml_set_name(out, "out"); return out; @@ -2220,11 +2241,12 @@ struct test_rope : public test_case { for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) { if (t->type == GGML_TYPE_I32) { // pos - std::vector data(ne_a[2]); - for (int i = 0; i < ne_a[2]; i++) { + const int num_pos_ids = (mode & GGML_ROPE_TYPE_MROPE) ? ne_a[2] * 4 : ne_a[2]; + std::vector data(num_pos_ids); + for (int i = 0; i < num_pos_ids; i++) { data[i] = rand() % n_ctx; } - ggml_backend_tensor_set(t, data.data(), 0, ne_a[2] * sizeof(int)); + ggml_backend_tensor_set(t, data.data(), 0, num_pos_ids * sizeof(int)); } else { if (t->ne[0] == n_dims/2) { // frequency factors in the range [0.9f, 1.1f] @@ -3813,6 +3835,12 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_rope(type, { 80, 32, 2, 1}, 32, 2, 512, fs, ef, af, ff, v)); // neox (phi-2) } + if (all) { + test_cases.emplace_back(new test_rope(type, {128, 12, 2, 1}, 128, GGML_ROPE_TYPE_MROPE, 512, fs, ef, af, ff, v)); // rope_multi,m-rope (qwen2vl 2B) + test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 128, GGML_ROPE_TYPE_MROPE, 512, fs, ef, af, ff, v)); // rope_multi,m-rope (qwen2vl 7B) + test_cases.emplace_back(new test_rope(type, { 80, 16, 2, 1}, 80, GGML_ROPE_TYPE_VISION, 512, fs, ef, af, ff, v)); // rope_multi,m-rope (qwen2vl ViT) + } + test_cases.emplace_back(new test_rope(type, { 64, 128, 2, 1}, 64, 2, 512, fs, ef, af, ff, v)); // neox (falcon 40B) } } diff --git a/tests/test-rope.cpp b/tests/test-rope.cpp index 4656b30f0..322b8bb99 100644 --- a/tests/test-rope.cpp +++ b/tests/test-rope.cpp @@ -138,7 +138,7 @@ int main(int /*argc*/, const char ** /*argv*/) { struct ggml_tensor * x; // rope f32 - for (int m = 0; m < 3; ++m) { + for (int m = 0; m < 5; ++m) { const int ndims = 4; const int64_t n_rot = 128; @@ -147,28 +147,69 @@ int main(int /*argc*/, const char ** /*argv*/) { const int n_past_0 = 100; const int n_past_2 = 33; - struct ggml_tensor * p0 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); - struct ggml_tensor * p1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); - struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); - - for (int i = 0; i < ne[2]; ++i) { - ((int32_t *) p0->data)[i] = n_past_0 + i; - ((int32_t *) p1->data)[i] = n_past_2 - n_past_0; - ((int32_t *) p2->data)[i] = n_past_2 + i; - } - - // test mode 0, 2, 4 (standard, GPT-NeoX, GLM) - const int mode = m == 0 ? 0 : m == 1 ? 2 : 4; - + struct ggml_tensor * r0; + struct ggml_tensor * r1; + struct ggml_tensor * r2; x = get_random_tensor_f32(ctx0, ndims, ne, -1.0f, 1.0f); + int mode = -1; - // 100, 101, 102, ..., 172 - struct ggml_tensor * r0 = ggml_rope(ctx0, x, p0, n_rot, mode); - // -67, -67, -67, ..., -67 - struct ggml_tensor * r1 = ggml_rope(ctx0, r0, p1, n_rot, mode); // "context swap", i.e. forget n_past_0 - n_past_2 tokens + if (m < 3) { + struct ggml_tensor * p0 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); + struct ggml_tensor * p1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); + struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); - // 33, 34, 35, ..., 105 - struct ggml_tensor * r2 = ggml_rope(ctx0, x, p2, n_rot, mode); + for (int i = 0; i < ne[2]; ++i) { + ((int32_t *) p0->data)[i] = n_past_0 + i; + ((int32_t *) p1->data)[i] = n_past_2 - n_past_0; + ((int32_t *) p2->data)[i] = n_past_2 + i; + } + // test mode 0, 2, 4 (standard, GPT-NeoX, GLM) + mode = m == 0 ? 0 : m == 1 ? 2 : 4; + + // 100, 101, 102, ..., 172 + r0 = ggml_rope(ctx0, x, p0, n_rot, mode); + // -67, -67, -67, ..., -67 + r1 = ggml_rope(ctx0, r0, p1, n_rot, mode); // "context swap", i.e. forget n_past_0 - n_past_2 tokens + + // 33, 34, 35, ..., 105 + r2 = ggml_rope(ctx0, x, p2, n_rot, mode); + } else { + // testing multi-dimension rope position embedding mode + struct ggml_tensor * p0 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2] * 4); + struct ggml_tensor * p1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2] * 4); + struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2] * 4); + + int sections[4] = {16, 24, 24, 0}; + mode = (m == 3) ? GGML_ROPE_TYPE_MROPE : GGML_ROPE_TYPE_VISION; + + for (int i = 0; i < ne[2]; ++i) { + for (int j = 0; j < 4; ++j) { + ((int32_t *) p0->data)[i + ne[2] * j] = n_past_0 + i + j; + ((int32_t *) p1->data)[i + ne[2] * j] = n_past_2 - n_past_0; + ((int32_t *) p2->data)[i + ne[2] * j] = n_past_2 + i + j; + } + } + + // [[100, 101, 102, ..., 172], + // [101, 102, 103, ..., 173], + // [102, 103, 104, ..., 174]] + r0 = ggml_rope_multi( + ctx0, x, p0, nullptr, + n_rot, sections, mode, 32768, 1000000, 1, 0, 1, 32, 1); + // [[-67, -67, -67, ..., -67] + // [-67, -67, -67, ..., -67] + // [-67, -67, -67, ..., -67]] + r1 = ggml_rope_multi( + ctx0, r0, p1, nullptr, + n_rot, sections, mode, 32768, 1000000, 1, 0, 1, 32, 1); + + // [[33, 34, 35, ..., 105] + // [34, 35, 36, ..., 106] + // [35, 36, 37, ..., 107]] + r2 = ggml_rope_multi( + ctx0, x, p2, nullptr, + n_rot, sections, mode, 32768, 1000000, 1, 0, 1, 32, 1); + } ggml_cgraph * gf = ggml_new_graph(ctx0); From e52aba537a34d51a65cddec6bc6dafc9031edc63 Mon Sep 17 00:00:00 2001 From: Evgeny Kurnevsky Date: Sat, 14 Dec 2024 18:17:36 +0000 Subject: [PATCH 019/372] nix: allow to override rocm gpu targets (#10794) This allows to reduce compile time when you are building for a single GPU. --- .devops/nix/package.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devops/nix/package.nix b/.devops/nix/package.nix index b88e6ca80..043c4364b 100644 --- a/.devops/nix/package.nix +++ b/.devops/nix/package.nix @@ -31,6 +31,7 @@ # Increases the runtime closure size by ~700M useMpi ? false, useRocm ? config.rocmSupport, + rocmGpuTargets ? builtins.concatStringsSep ";" rocmPackages.clr.gpuTargets, enableCurl ? true, useVulkan ? false, llamaVersion ? "0.0.0", # Arbitrary version, substituted by the flake @@ -188,7 +189,7 @@ effectiveStdenv.mkDerivation (finalAttrs: { ] ++ optionals useRocm [ (cmakeFeature "CMAKE_HIP_COMPILER" "${rocmPackages.llvm.clang}/bin/clang") - (cmakeFeature "CMAKE_HIP_ARCHITECTURES" (builtins.concatStringsSep ";" rocmPackages.clr.gpuTargets)) + (cmakeFeature "CMAKE_HIP_ARCHITECTURES" rocmGpuTargets) ] ++ optionals useMetalKit [ (lib.cmakeFeature "CMAKE_C_FLAGS" "-D__ARM_FEATURE_DOTPROD=1") From 89d604f2c87af9db657d8a27a1528bc4b7579c29 Mon Sep 17 00:00:00 2001 From: Michelle Tan <41475767+MichelleTanPY@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:29:45 +0000 Subject: [PATCH 020/372] server: Fix `has_next_line` in JSON response (#10818) * Update server JSON response. * Add unit test to check `has_new_line` JSON response * Remove `has_new_line` unit test changes. * Address code review comment: type check for `has_new_line` in unit test --- examples/server/server.cpp | 2 +- examples/server/tests/unit/test_completion.py | 2 ++ examples/server/utils.hpp | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 210c36e01..5cc86bf7c 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -459,7 +459,7 @@ struct server_task_result_cmpl_final : server_task_result { int32_t n_decoded; int32_t n_prompt_tokens; int32_t n_tokens_cached; - int32_t has_new_line; + bool has_new_line; std::string stopping_word; stop_type stop = STOP_TYPE_NONE; diff --git a/examples/server/tests/unit/test_completion.py b/examples/server/tests/unit/test_completion.py index 7f4f9cd03..062ebcd4a 100644 --- a/examples/server/tests/unit/test_completion.py +++ b/examples/server/tests/unit/test_completion.py @@ -25,6 +25,7 @@ def test_completion(prompt: str, n_predict: int, re_content: str, n_prompt: int, assert res.body["timings"]["prompt_n"] == n_prompt assert res.body["timings"]["predicted_n"] == n_predicted assert res.body["truncated"] == truncated + assert type(res.body["has_new_line"]) == bool assert match_regex(re_content, res.body["content"]) @@ -48,6 +49,7 @@ def test_completion_stream(prompt: str, n_predict: int, re_content: str, n_promp assert data["timings"]["predicted_n"] == n_predicted assert data["truncated"] == truncated assert data["stop_type"] == "limit" + assert type(data["has_new_line"]) == bool assert "generation_settings" in data assert server.n_predict is not None assert data["generation_settings"]["n_predict"] == min(n_predict, server.n_predict) diff --git a/examples/server/utils.hpp b/examples/server/utils.hpp index 2fcb895ab..c6f08bf21 100644 --- a/examples/server/utils.hpp +++ b/examples/server/utils.hpp @@ -22,7 +22,7 @@ #include #include -#define DEFAULT_OAICOMPAT_MODEL "gpt-3.5-turbo-0613" +#define DEFAULT_OAICOMPAT_MODEL "gpt-3.5-turbo" using json = nlohmann::ordered_json; From b5ae1ddff93403300fc79c7ab5ee73b8cfbb3457 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Sun, 15 Dec 2024 13:16:42 +0200 Subject: [PATCH 021/372] gguf-py : bump to v0.13.0 --- gguf-py/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gguf-py/pyproject.toml b/gguf-py/pyproject.toml index 10e94876c..9c3956256 100644 --- a/gguf-py/pyproject.toml +++ b/gguf-py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gguf" -version = "0.11.0" +version = "0.13.0" description = "Read and write ML models in GGUF for GGML" authors = ["GGML "] packages = [ From 5478bbcd173e7027af7689493c7421719f5c43df Mon Sep 17 00:00:00 2001 From: Vinesh Janarthanan <36610342+VJHack@users.noreply.github.com> Date: Sun, 15 Dec 2024 05:55:54 -0600 Subject: [PATCH 022/372] server: (UI) add syntax highlighting and latex math rendering (#10808) * add code highlighting and math formatting * code cleanup * build public/index.html * rebuild public/index.html * fixed coding style * fixed coding style * style fixes * highlight: smaller bundle size, fix light & dark theme * remove katex * add bundle size check * add more languages * add php * reuse some langs * use gzip * Revert "remove katex" This reverts commit c0e5046accd10be3f83018cffdc29a652849fc61. * use better maintained @vscode/markdown-it-katex * fix gzip non deterministic * ability to add a demo conversation for dev * fix latex rendering * add comment * latex codeblock as code --------- Co-authored-by: Xuan Son Nguyen --- examples/server/CMakeLists.txt | 2 +- examples/server/public/index.html | 389 ------------- examples/server/public/index.html.gz | Bin 0 -> 1205102 bytes examples/server/server.cpp | 11 +- examples/server/webui/index.html | 4 + examples/server/webui/package-lock.json | 512 ++++++++++++++++++ examples/server/webui/package.json | 7 +- .../webui/public/demo-conversation.json | 33 ++ examples/server/webui/src/highlight-config.js | 60 ++ examples/server/webui/src/katex-gpt.js | 66 +++ examples/server/webui/src/main.js | 64 ++- examples/server/webui/src/styles.css | 26 - examples/server/webui/src/styles.scss | 48 ++ examples/server/webui/vite.config.js | 59 +- 14 files changed, 838 insertions(+), 443 deletions(-) delete mode 100644 examples/server/public/index.html create mode 100644 examples/server/public/index.html.gz create mode 100644 examples/server/webui/public/demo-conversation.json create mode 100644 examples/server/webui/src/highlight-config.js create mode 100644 examples/server/webui/src/katex-gpt.js delete mode 100644 examples/server/webui/src/styles.css create mode 100644 examples/server/webui/src/styles.scss diff --git a/examples/server/CMakeLists.txt b/examples/server/CMakeLists.txt index 63fca1d59..a27597cbc 100644 --- a/examples/server/CMakeLists.txt +++ b/examples/server/CMakeLists.txt @@ -15,7 +15,7 @@ set(TARGET_SRCS httplib.h ) set(PUBLIC_ASSETS - index.html + index.html.gz loading.html ) diff --git a/examples/server/public/index.html b/examples/server/public/index.html deleted file mode 100644 index 9a19c5e83..000000000 --- a/examples/server/public/index.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - 🦙 llama.cpp - chat - - - - - -
-
- - - -
- -
-
-

Conversations

- - - -
- - -
- + New conversation -
-
- {{ conv.messages[0].content }} -
-
- Conversations are saved to browser's localStorage -
-
-
- - -
- -
- - - -
llama.cpp
- - -
- - - - - -
-
- - -
-
- - {{ messages.length === 0 ? 'Send a message to start' : '' }} -
-
- -
- - -
- -
-
- - -
- - - -
-
- -
- - - - - - - -
- - - - - - - - - - - - diff --git a/examples/server/public/index.html.gz b/examples/server/public/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..d7816b04fad757c640aebf53123c1ef7e26dc9d4 GIT binary patch literal 1205102 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%0DS90P*F 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

    ^fMw1~7p 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�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͟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Ξ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

    F#MY#hx7GnrH-AhS)HGq4VhlmsY z&MkWfl}Wutplh02M^q9F>KW)HX*%ktC$k8qrRG$J>Uq6Ct#?LoQoz+<5CHs#PJ6va zd>_$bvg9hD)dcsu+YG6Y3&)TBP35iS3nenjc?L;9S6$(*J%UG4l7+AutZb;l#n`qLiYj*kqbU-*vFhtwY=&?n zt~7$OG>73_b*bu`8;U%A+onqStiW5NZk49dH4s$dP$F%B10RS;2fBQ12VEWMtt!jk z0i=gN!E>H48{3e)8u7KAVflEc-hMue!tica8%A{(6zk8f4+4w~kH~C*(n+Hw%ft-S zVQ+z++xn`=Ijq@srbFF`=h$FA8@&1__0l*k+NS*w6>ki-kYXBiBI1ffH*eyTWCNoO z1KmLO_~LQ!+ISCSu=*m39S~>|3pYl`bi}|mL~cCs1}G7DQJyd1mVZiw9uaP1hWCu& zm(pK4HFKHfRgol`)wm^qc?+;P89!Kab&bA(+HOt@{Zus4ySj~Ek~FB=eRK9FPmV) z3nhoWA_=V6O7s~qg!i`!K6nbgP?6a&%9^NlE)8sw(5e*yVN1@wgf?E(~bsm9MmV1m;D%`KF?FSysrWz5yQoE%77xPAa zS37fV>*LWh+I-PhDOl*(ARs5#lrem=%}zb%vpJ%NdFD;|vw{F0t_^x<|44>`$jYkn zC#JqioE1|r@|CT{=I^I2}huI}fyTpA|KGJZQ2>wguY@$(~V@}KTDJAZE@`k58 zX^^N>&T1fXBEb-FjF~P5xD=8=9g+N8Uty`X1r|nws#nGhLEXT&O+Lh+msLmXwt<~8 zMdQP1db^dDhGvQ?52DK4$YaEXM!&8~U$jR!Xf~4>lSycAe~T1$_V*wC5<14E%VFCM z@Qr-h_AH<|)iW}X&q|Y*l;aRBQB?@c1s46wA!Z+F6LW-hA9;qQn8OdFPE-H0@N-dy zAwrbFqgqJ=WBhhzM(S~mL#&I*S;76x%srT{rIy-+zEO@d1_~?3Dru?oYKL6gX!WFu zKC*IChM7Rn!!(mM=aNMq&wsyM1wTq9oJVY@%gdXQr`|pQ`Bhr%S@0H@1q~-`OoRXZ z)t{v1GD$?OoxXCo>8h@v33pc)>ghTQNep)0LUUiW3vt$mYQHq>a6W5oq0Jw`ro_mK zjSru)m`Q?YE~IO61g=}m7pu+4-XzXDdgsSWd%>@*3`THHSX0;cWz(Kjg=WV0%o{)G zzvRTheSy2!s+l2<8gi8Tpe=AW-Hig{LRnvn<+YDWXsNI_Sx?G=~X4f6%yyruG`S z&TCSpyO6>`6+XU|J$oOn1HxR1Mc~^WO%$hQqYi&plrNOAFG1C$Z-6t1#PhvHiWM4W zYplbOXr+;e^-;h;gA-i|G!5bV8B~G2z2SC2V>a(a>>mt_X8AEPxd`@_?p0w*Mrn9eDyK^bLxe=nLajtSel@Wq2&1maX*5# z@Ol?w&lX6DwLWrOts+xGe1qduQM9tw@@58CGB7F5z!i-iQKD47kGePm1YxYQb2)%i zX*WCQ>j~HKdIEfYRBGS3;_kt>;1r=ya)!*b6wMXBCiE^CsWd9NLdDy3J$8Pm%V*+f zeSK$rAY=tHHW)f9V4?{eGO=j5fr{IgaSc|&dWZeD!ure0!Q~oOdT2Dr^I^luGr!yt zOL|0IkFat6a-A)`9+>VFy1LoJc`nA<4$O@9Wg#7;h04T{)P4E*XLu7xH8%jr++k@F>haGZKmX2##AJ}hc{mxCjj z+AdoorG&W202;ID+C13uYrWtudy)CLv|`QWI;ho~k=xep@72Qj zt;_9L_TW4!=|j%E`n_+th2uSN6TYkDMWow_wSgJoVqj`zA`Vq$@1aKhl2wxL$|P2w z3x3G$-l0`kRP*wD3iJk}OQDC-^z|dq(kOqkBNPy^T{(gmzFEF)xd9eaIJJEP6~=6# zwUDD8i~`_{RnnXKqX~3#$oCf%2xu)aGS+FqceZI(286tMV})Fi0@y6<=SOP z_iB&#R;ee}7^Y^Lhu=g@Tz7DVp5PsFhem-?^gdr)@CIkk+$po3D>20Rad~=QQ@hwc zoR8}(e5UqV=+3XhJMu~*vq9IqRap2FNr;20>PJ_iO#7>1c|!mcj46+7G~mYG>=qQl z^oy(~*{KhxEbTYZb8#ZQ`K$Ub^WEq+vE0wB>}Qa-lj4TxE~JPRa?g7q?vc3mP*Lnn zp+iyB&XUH4fk`YJ5ZJ06%SBu&4`8*EcFv5Cnnw3SxUI9-oa;k8%)<&vW?E0LM;H&o zJIX0K+9Of2bCAjwO!I9@gtBEYWoi&mU-oebyQ5w+yW8)rXA3dw5>6>rbW=M0K4WDI z1v}L1q&118ka$|$$#7g(8+Y}G4+XB#VM+0XKGID5Bs`W8@SvY@om{b>qUh%sE=Zg% z`N>JK_Inh@Oo7pvwLR`+_%Ri=v&7pA@ylwxyG_}UE59q>_sfiND!nJ!7|!CDNseP0 zV*5A>8f69w7@#XsIJ^D!b8bfDE|1}bYpt?zF%I18t_*zcuyGwZ&olNlpAHQu37c&5 z!uUYv#mUW39Y|eWAhwZS$g!Uri0RcJ-pMdF?ez=wTKb`DYc25dJO?@xmE5YKbGW*z zyarbBOB;0=kJD9^7EF+~p-V87BM0uTp)p8z4zg{;M$fg?G2cr;SNCh&U7$EWtK59O~2L1I> z>QB?vDS#F)bJ0sI#dRHoPoM#P%%-Cu!Ixdaw^i5PQFWdarNu`x)&1dH&$0O*mJ7ri0B zp{|~_Y-_lhSf*tvo9@uAEeuG(9udEaQd)fn4b|u#qr}iQ%BF7`0OyH?;BF@ zeXBkPhSOlxxzH=#c-Ct-(beNSDbSabD8oEcN-KRgQ8HWUt} zSx4(+6-()Dg)JRlWZ*P_?Ua?f(W&H6KDd18*otN_WG8ByHcZ0mT@%7T|6uTp@ca1u zEeOQ!Yacx86sX!15{~!^QO;y}hpJGbjCGS6Pe!h4dcXDL`K!#Vz(1<9-Vt!qk&h$^hFB}=EqjU%7t4w5iwxsd{m^T>sH4! z_sD6Y*U9Or@x+VOZd{s{Ig#fEAeWV`H*eTHg40^-c=G7EPpKw1sBc&CdL1`1VNV+{ z`RLxzvsk|89K+C*quWQ=rZY?{=gLPO$xm_uE*j`_6F=CJhi6>scXIP`yU(}Ri2Wg1 zuWx9lZ$ZY1ZBB&KL{{Tf-p$!s#AQVzWj1gJkZ0jGeB2KUbOWmpHL|AB5yvYI&+IO} zS$aDISBWou-yCm;8r{BC!G`r{`)zH)p8OP7ALrY_PA*pNqEx@}l1^^HBr`@n%3& zYqEq-rdee%G~P;y>p4os#QECg%iU?@vWzG3lSUSjx8IU1^8qx7uRkC}tcg=rJv&88 zMgUtVxR}_>z;eUD=>Udl@aT1yMMo#KmceX0oK%b&YN_$!Utl{>I~KwLmvI%l9CZwl@7dG6w%C+D6T~-Y;>w>+ zUzWRwZh#afs>05-4ar>P9gC90R_4aUW8Dexf&LN@Uj&0Gfb~W6=}t?CpTP2Xpp6|= zi)}DEV0ztrjg)__7aKijs>dK50Kv@kafv>pakp%aztTI#T#q)dyXh_J(w_`28;HmY zDkA1W(s8U&_pSKdu_GQUx`yafUO#J+suC1evn z3sc?l0xaMdg?_krsJt_coo&xSq$?%MI@-ayJ3`keT1rs&Y#_3z0H%AB`?N{W!IFN- zoWs`hw`YhX-&#f!m_HjlaSLHhg^1HfCAnzZd0$EtkKh13qYWZq;X1?h3T=*dPY5UQ zc3?C4TgUO(DO0k$>r-?10i;Ag)mxy^J)0Q5&^npCtde31p4V#Xprz?(yYp-YAs$m= z#9Zs}x9HK(ewkHwzMP>*NRb~81sdv)Z6h|y#~;RP_Rv6F{kdIFEVl&g4PWt{*CBJv zIEX47m^>TbY07}|Yr6&s_J=ML>YTCBTt(W)P7EW?V+0SaChF@rm2{vavgD~BR3M^|{ic^ph`xW{Xu6WbWJikBl`%xxf zYQ5u0#qLjXD|E!m?@vdjfo|z~gEva$JRqShjiP8#Xnckz8IENe-?u9xC*{=m)^4eK zKZfAs!pbK8Z^AUI8=LbF`kA6cs}#H&PO~8=v}qefNrS z*>-V#?`GSHgL{(0O}{9|Ib;ohPaooelxyF{RLublx1pi!1Ipx+Ti z06)L1##&VeRlb&szPgb(B8Ye@mr5z_c9Op%tKq+5#hXde0VC0M1!&C4A9No`e)W?k zS4MK?Jr8cDJN}0O=Q1cYfPfzsgJcfc?X@R%Mqc~GE5l(Hn@ap!E5PID8M(m3^F zQjvPpiM>O7Y4*Ef2;el>awOoKG7+a9ZXHWe3C^R253=Ly-XM|~fr)3MU@p7sqOF+* zfmjez#Eq(ZLasiae{KFjr>G1$z%_6Y$aHhs$9M&9DCq_z{EW`yg-CR|zh7n_xhJ_a z0u1;%vzg=bEforsxC_F_q)$;TrnT%MvArs7p*G-3pzB2%)j;q0k4*exI%fD%P#pq7 zaZ%1IU+m-OxaTco>A;`fvWSw1EgS4Qi>ECLos+{$xrq%uK? zWNum?g%gLLg3ew``W2?*Ri`nI%iGYGC)yr5qn#R*#XwV7mj-RUUl3c0udjTq<3^s@ zMBTts%acuz*Fh1C8LbB2r$}2gI-_f5g0;+Aw|?)s4f}I8N1{bez2*KVQDj75vX^0K zTgd=IYBV!o`Yud8K=X-&*_RgAPhzUDt9~#J2bFJ$w9 zjdRHBKIutdc8kiORAc`axg>)$%<|A5)VU(LJw``seii-{Jcf3}r%ntgjq38DyI=rE&Xi{v=L_fk`%J zEbkkd?2CTpOq5Ca%S1F=J4NCfy3(>po1+CO)TLR7RS@u8>C*|U8qCpZJ(IG)kBcGi zqAu*}T9CD!W=c9hOKxsf;3r^>Kl`~ z9Gl{~BlvluG_}PdnN1--S8ui+9t;nbua}(ca)s)y)7V%n4Xb<*0$`M&BW*+IAN>ESY;k9|UQJ*O#( zFkRZ-dox~Ug!T&O=A6oFa|}2A2be*>A(`kuS^qIk-lN59z0c(#O8qNELtopyFV|iR z>+{|pkobg_b()TUik&@QtXnTkcKL1*TbtEzwL1se&tNba-rXO0N5fm#;_KxYZQqwm zf0HvUP5qO8yc@=(-kpR=a?)EZM?L+=y^gBEextFQ9T<5XtS)z>c=Z6T^|F@+ozWy}^5%yx*1omB=(2xK*012Syd&4w z90YuJ|@jRx*y1iyW1l12a#_7G^<(2+s)1>j#-o2uv_t=yfv2VS!1hj z?=+ryp1C`)uq-#jHXl{b-07ohe;=QB{lO`%`;&KXy;h7QQbHr;O%)jEuF2H9y%JC%!slyU>twy{Zq?_!+O?+3{+kDslac znbsq@WO?6ot7Mjy3p3=K&_DIe9p8+y3e0@GEzliInd}&PKFyypb?fG8`E&g4ndUn6XK0*CHGkJ4F@2F(_x@$9W%>JJ z^yRw0jx#2(Q&p&f>Rp+dMC0Mv70I>rJZhp-Vxn8}yy}waT=vN3(n7)tsUTH7|TQX+9uM|K`pSx={KWlN zTByymU(^Q<>N&&L0Gw$IIDly4rIvpC9$9A4+E>mJ{=;L#t% zv_A-7uC4or!}7YDQO`h@t3NkDK{!{hPi}xz#Ce+8OhTmA>?~hr`<4%8h!HnYSIBG>gn{(4W7teELUkzBKdY zW@}xO*=T0ZmiuCI*81M&CH38T=x?jxEKMfsR3i`^Hm(s3!`uC#U(EH-!ny>vaLmmS zA>N`mWmArxV$@8<>bD_2BOmyxnJ#kD=tUAe=%fc z=jVBHWTQ#xyt6dg$YXlIdKfxWGvCzlJkP8?kwmY|PXb@i#!>`)O zur9>r64=_|>RAtid8;cvR&<@$g`@B7_?3(h5Hde_*jcWcvnYbrXo67mt~f)HpBlxs ziZt)wCmUkYc#n&lYA%FY?jX!tsiX!{v3;w=eRs zk>c2lxA?mDh1Hy#L(9lwb-us0QTa$o>rLOXOoq#;KJLW=xi2T!vFk1Do4Bt%+;UFl z(?v8fgL<;G^ywi;uIAwAUPK+9v~hEAM#F=%&JXc>lIGj#a^H?GX0eOYyKxvS#y7rivOM(mQFuCJhnKeKi8WiLx4yB}u2>8%X^r07QEQJN z>#anYG}}Q~jc(K9<26lI)5GJZTGg=@R~df~V_uF7{Ig~IwaK)tSX@@8tk}p?PG{M* z^(KSRJkn6t9z!u3BWFb&^Wwb@@98;^(PDqy=tuTkxXa7Jfl>{&&gB-L)|GBfJg3dkgne8b8U_4o&PNL zYfN{`{-k);)&M*|iMW@o)dQQ0C{kwtM$~kc*Qjbk0p*sFQor8p96N^VZnYq4s#{+6 zc2RP=p2{C?*@NrlG1a)a-)?MepXVz>nClgelL$_m>nn@zE=DfQH&+R}JMIl{;bxUQ zPx)~hKTg+7oATXLyB6A1Yp45ZgqP`h(14gfPv&!F6{p>arRg5M2Gf@)oARAri2ZJF zjsMaw>$Cp~uJKsTin7tX!#J}i$LV^JkI{9S0-L|w)sV%PgB2{7KU3?X&-K=yXsv#o z3N-6;QSYDU$>Q`57fl}q)4mwb`*WC#dk`MpU@VWhhp+45X7jk;g8Qu3_eOlw+s<_} z+1^I>X&bl4>C0k2v-fmf9TQC=e^hLfw|&i=OBXzQlF=Z$t?Si!<05O0Qa*0$ zfa_--BB?;y+1^T=P zi?X@;x9sQ*6SM+IE_FE7Hpj)Z|HJkNI`il4TH`kX?V;Gs6a0v3XR)2d&)0-(j;#|; zo4GOaue0&u5^9M{3u7Bf`rAGa7K@aL(^b~f^=4|m~6TstCZZ0U>SEd}=mT|Zit?B0Zu9%sm$6q4e*~vZ2o#c>h z-qSw4KU&tZcE9(>?QGs3o$T^wU$=|mHjN%BbNuM0?W196la(vTG~e52%RKr_OAeF< zt~iBRJTV;U<>XdWuVQ(5KX=$XU*>q-lpb5=*X8i}@`<*IPgU+D`ThLf&5C6fAJg0F zs5|$w=iLI$nV%QU!F${$h1}mC!zoWMhwP&1wL7D6FdBJJYh*1S(LBB{WPU3n!-8Amg+wb=?4(CZbSwEM9y@a|yGmfL>yVsoVqg9e!&7sxo za&10she_ybtMW*9$>_e>{LHQ)fywl?ef+>H-@V+qKRqvYZ~dp~_a={@!QjH4Gj&Fr z%FkM)4M_=zgS1Zf@vz-J)fp8Btv9Op%c*J~@ZH}O8*r<(hm*TZ@+8jY4m;N#hB{_w-LZAY?vxc8rS zSfAeS_wtDR$$U0{#OqOiB(>qZ-(Rkm$7Zm7t}g2;_SU;%Fr6RDQQ~5r1g=^5&9r;XK)M#R z=(#baS8cRswd2Lf+T{DF&)P^Mv$1@Jai+7Ay&%uij9k1h%A5@?oDCHAMzqUN@GHjS zs!jWg_6)3H*HX_5mYJD+LOiOMx7n9JvHE=p%YUEM^j}9cJ)eJ0Y62kYn_hRkkVGOJ zus17LZJs;;2<{GHO3d!$rS7C90E9YPjQhp@!Uf#Y%|QS}t~xFWZ8sNm*{$fSzm@=m zs^gJ7{r9A$j@v=&xcfD`?5xu{HMDDYAe1Ko^jd7qINO+u5r0+y`lMri+|S8M-APKS zlil%8*speLf7~bOOP#E=yme{ljNcIi1=@>vCJk-0r&q+$%$w>e(54-Q9SF#$M zHm=*R)%}O+E`n`p&fC2)mmy05j5Y6$pIWPvlTde35&+_McXAR{hefHAs-OWH128}m zfYqcWLE4glHK#Lgn4oe0@MvI100ere>m|||0z4GGNS{7iB1tgIAEDc_#^8yC8kW0Z zqPs<^u`IHTVCgfR)Miemc9X6G#8HyPIqWWTSUarGji&#M_rNJ$3w2-EfPIRF;0yt! zu#iBXftDM*`m|FdBNwy64f*KPW@;jlT1X@oZRqI#{&&aFk>t7@FK|d|5X1mcF($Q* z$tbfBEOqg)Sx7MO2xB2NUC}3dv0dg2fncwNBo@lb#iEWQgOmT|eRUWYTKC(r9!X~e z#sjt-=yQcqPn4=3CnJj@)G!N))T9kPyI~TzEib4{O(c_o=E=Y<(h+Uav+4_L)1i9p zVwT%YGH~^D$l7$I#@Wr%6_N=?GHqS;xi)E8mZ)o6MoZUSTQV`b_L|g#jJN-|o^JZ; zn4sqZWaMCwSn$Dq9sPNYd@WnWQd>$KQG-WDY7t$B$~>%V7DyT)&@faIK|I*|+5;o0 z**Xy2kFr$^iGw%~q9I)DYl-Z9vtI|F>#Uv1#_|BPutyD?)ejgd$r zqfXX_8dsUB&lR>zEtaJ#!{^H0mLR&nMYN#PMwO>-`&w;?=^C zq(VS2R&8dQXJf`N7|&f6J=f^52(8kGEH!k_b>I{^oM1gnU004B1`lkBgy^kyH3LCG zP&~-AH=2(PBx&pe7~rh?4X`)7#y}(#pqCHz}e;Z*W$|d5C z78Vq-t9t0*OH+UeqSs4N8Ku@`~Z1)`IW(RZPrr&y?xj4uC=!S)_ogEhz%ISU{AH zoWQr&T+>}S*;}V`Mg(185#9Hvq(XL;kk)lQDQ;e)%)js*CzIT_%L)U zsJGM#i?&p#3#;}rq1qFwy%1#Ao@O^`Yt+f=A3mY8P1>eI(k5s@#x#TyV_~~?XqP6Y zxgnkmv6>jdTHc10g9US8*j)GH*HHN5lKR9(&KN~!1>XoPL2Q;1kdF)Pq0qz8ja(Czf}<=l}(4+#(vf!c25O;bf&* z7{-w1*f);$p1#vJOjEs+w!n1ZjF<19vbSI;B_k%&*Px>GC z6BVoMi;GVh0%0GZJAroBN5W3J_$a!5AoV>6fAQTnu6<$_xROqhUyRL~RL5-=r5fPCN}%?D1uexEhQzhmXEPak}J z`r6JrA8w&6iqvPB!r>}@h8#Hsyr8Kq;wQQu&??elq-TciG_%+$(uYLJf#;9H^2LJq z$<(X)&E^^|GI6u)CwCd-t293@%y=1q2`o#yoXVz!4Ji4PrgNgKYzsQeQIV$5g(BZRwmrkCY#~ z>c4(0XSpt@^#{)s|HF8TBw{Tcez9jv!=w+tW85aF))Pr}RvA7ZlEE&#WOM};0`X|+ zNfSCWfh9KF-bfDbNsWNp{6f|?dR}x%(T~o?MhhjyH4f<%5GfI{2E(4MZjksjs_UMJEp)=+=MG*&a~K2$}LrD*v-+hmlB^%i3WQe%4j&dG2`R7Mld(2VdlxPvSAfzSZjs zf)G$dU{4_n9n*W7;Gax*PjZkH2i#ajm_I@p83vRmDh(eQR^O7Ov&(+3!j5#fa+c`M z_VB?Ep{ui2%~2OqKe)mA&fjm2^XmsbIZ~01e(~RT?O$va3zZEwo)K+dH;^2o{wzdL z=^(h_w7wn%G}~!}lQgLe4c_C+^d|(eADFR{>k!I+`F&>b)T~o~vB_-Xd*A&)oWv^WMho_>E@FJQn)ZyF( zy&Hexb29qo94mvTmVwjrpFHE^gWC@d?(*x;cx3FGi+p|I?|8JkVOUms%kphcPj-f! zWf;W5&c{!uIWirLGAnQfdWyTr896OK~E z8H1b^z&SUYy0D~6fJX(*9}m;tKY74^FmS|;F~aAlXZn+cDfh%C1r1ccaTCl@Tm@bL-06)?I^lMYvI z@(LjyML0-yxnuMXa)xlYIKSKE4V;)Lixhw7c6KP7GhhKOSAOI+;-P4qj03d)oR`k$ zUF`fXzU*xB4-QPDZ*Hf2XV~Qze{;hjYPp(6lYaB>E?<0a7VC`dmo+OvCJ053ba4`; z9Zo_W7`KhmhAcDv7U8oYH7+D#xS9s-SUQ3^5bo(Bc$!WCt2HSfcB@r7jFE~9b}8Nq zBKJChR+qE0r6nZ-!WN}A+cfkJdF**DHA$Xc!y~yaB%$jlc`S-q+r?)xQt>&1TLiX* ziHgr|P*Q*{KDX@G{<<7D`L4llY$&49mt#_R^iRD0=3Kw=x-k^?Y!kGX)08ysb#YX#7=#Lr6eFQ6By3Z!8Y~Vp-T#XQzDH7>I!~vc-iQIdGbX!6UYV#6@{}(K93TLcKSuzqq#;A5A{(Ur|I1e z>4<%~gMZoozhl@hkM!Hej?1IJxJ#`M@xf@nd>!lZSwCLJ#H2%QjQuOHXuk^b9t{KW zh)-;5j8D$G5o}*-E3+X-JtU@4GrBn;i^$Ct{KuKr<<<_#$)K?N^sNqroY!kTCUvEI|-|Wf-N^pu=7o%xSgIJSStP9T!~LwIcJu?!i3) zgDd=-56n8%JAcu#A*oqQy1Y4!)%@B;l%Xz9C4&!V%m!+#>`an|#gz+>J(8OT2)gdS zL`fRrFSs!`Y}lq3iXh+?#1)E<(<=CR+#JaQG)b*x13wlJ9Qx6)-zZBgqKHJ%-m3$p{+c5ZWgh{01{JFibHxXoO!6m2Kjr}@YAzhM#nxU zXqSnZF2)%9aHAMpy|sE{xfm)Q6}TAKh{bj-1y)=W5IA;rK2vu7RB@Vq;`EmjO;@U) zDjxnf_DDu<7MZ%F=D)C7o1o3$dW^|q2?585^I4qDHc`bRbmqmPJuO^OVUW?rCCS8w z`gB-rm<5iT8q*)0DgeeDtvC^rT2~hfTkpX~@Jf z0%HYNKogH)3|xOWGh}3kyy6{>r`49$uuFEa91jUBdJCW!ZW1XD-9|hD&hYjuK9~w~ z1cwxNxfxGzS4lP0P&*mi8CcNqGUUrQs2Y9zpF+@(YwAAkKrjee8i*rg84nP|WwJ@mU44bX@z@{0vr_ijDtom) z`S@u-jUs%_lSotdn%3tNGKZKW`{$zCE=Jb=dseX0!9oBYyLO@2}eny~jc1aD0 z81l}yf;Loh;p1~QlFT7WkyXzxr7$WrmrG7jwWVkgH19|nTaZ?7BnUw^UV^mdkz}~L zFJ+rCRrlp~ywn%Jla|F@UKxDX(amr+6N+4&+c;0q8oFzKuG85+AizHgXRcM;usXh} z`tVKur$1j`{Ee5NINH^~I_$`Yu23R7j`r%Yg(dNfD4N<_&@L~Q1W{tY4IhrM6-XD% z?C-~9d7=x*#8Mgaf-{ViKRA_oP-%a8oVpwLv+AEAdFS^Gl&p=0y&+G`&YtV2_~azX zh^V#ab8IL~^7-9F((+d=yxn&1h0+WmmzWjQ!9n5&1!;oQpl-u*R2hJ-uyD7-3f*rr zbd&@QRb54m(SRx6f%~@vhePuXKBmi#-&1N4O4PV@JY7xf&$xB>pw`#lc~J378i6P` z(OHc3_AyrT;RojwKcqFk2!ecG{-Zs0eKpBmrmoMpnitLJuCL}qeCvz9cIPK+lBKaL z$X~l_qan%Y$Q25^CP?`x6$hb+kk`c66y&}5#=lGwmrIs{&yKlG(VCO~QpF%a{r-DA zUf>4-UL!c0xBlZaSMlnvjT%w^d|Hr_Bdv{eI1WO^KL95;2*x_%3?bb1{L>5(ImfU; z*2iC|#kJ`0irw{3l0W_X_q?tRlm_>H3qW$dz^Fo0csXI*hfTK>V8f9hSo>n9nx!n#9E4GX*B2Dq2Te!4!{Xc78n zxB40Q`XewvHtQyKeZ6vtKAUfY)P=_bVYKqM4cTmV(RdlM)4ts9GVQeKzcY6uG>nQ_ zyG!PLCp3LAz^U8iS!&#!Mvc2E;jVC^9YFlef4(^Dn^Sijj`ArA1OJ(mlZ%s%D+@ zMAfAfhU$-5n3#~{swRO+O!F>Jw03yJm9&eZHlcID6H$tA{ug{Ut$kQ?ijo} z9pZEbVKgx66fH!}2-xNllF)$7>7vDevS@{bpnCClt}rLm*cf-}pH8oW5|l+(qTQxY z5d?vJLN2{^#h9(l?>Z2qKZjm8e5m@{m&fnsbK3cD4)2b~4=Dfg_+f|jI}Hf?4=k;I zzIk1nb{P4W?=!+bwpkx^t_ArjqycH!FJ2yNHXld^g76^F+SO3F(SRn1j|phc#2E4d zO9S=qGt{29+q3+OiGe?{3*v^fa!h^83=zYyjuI}$OAwp~nNa*>x84%IV4!!nOMLlB z?TdZYedeFJ>gtXw<6rr~FGtyNA%EA}-(28q-^^k+c-mNyQfVMu_4wYP^1POtq;?k| z>uZ3;eIHjg1d$zBZ0Lm4g|ISR0-n!M$C8!5y=n+nI2ZufF_@in$7^J-hrHKIo;#=>33b=ImjQ`>NI^6KD z{Gr3#X=`w5{S&Xb__MZNx_jAhg2S38&LCY|Qp2n;(gc!~jmF!RxnJ$%L)DW}bI^2n zj|<4aPkdo5a#DG)zE8xm$I%3-6V?5*;VNB&A;<1#T$Ij_9lv&MKI*i?B}6jCeXWf8 zt8r5En*HHzbQKp>zBAGvBUdCAlhOsA63RjL(>T z`2`)R_kmvQmaT~(Cj^8qw#h`<5fO|~Mt|bz@VUvr#L&f3j2hMxg`Y7&&_>YBi-;YF zwAx9-OJzi#{Ym7BnX}@ixffRN`ktN;SW$Rmf)#=y9&JN)Y|HF8z1eO@~4)hh24BO;tq#MLtrOGOI^D%uEq8>I;G*F zFu9Q#En_-2CcY+q{IT62akz!tcoQHRa63r+>gsIy)qSTMxJS2jmL_m@LVhv>Bo32U z*@La{7Q1$FtHWFTV-Fu69vGd!Qurs008*9vDox_ZZ4T>YC@moc20lXw$^q+7w@A{x zRnQiEZNHX|2BO~^XEO|$KsJ9MI8N?Ju4pa@hU8|qqEmw^RVaQ7mCtr{lMR+#J_v5m z`65*l{>7gbl1yi9r;~|k7!A3!N{lMH4swb4v7O1tnDw2>Cgy%$q|6mm=@Sv;$q58o znaiJZ|CJ)FaSTOQPrNE!#Et*aMMRwrqfNtKt;g42#Hy}o@FebVqU~SfQ-XkVjB#~a zovNFYp;i2rXr}mGpHmyG-s(NsBTg{~#Q^}ov7hxj|EAhwsy)BUeM1k+=u4DtE?}LmLTOk!eNY&+K|$*f%{)^W+}31{i!si0JB%c$4P4?NPjVc7@(K3t zc~GqT!++;X>rWjnQNHyX8y{BhT`u8xpMW4FXd>))`YKgJ>mIf`@Anflv)V#hxw_KDSolAzy20#{#*N0e=oW?Cdd%^$vlvx zGUJLe84bNUv8 zn035fX$l&F5SpEpk=e`^ri?bG4>jTR1=8?9Xcp;DU#72BmWZmZ-pC*PQ=fSE=bY}; zdZZF+g*z5`@)t+8>e^}axAyyQ4WFt3|H+T?=*zXHCaOEkH9SStV-ZS(#g#>MWZ8j4 zcwm!2OQq5qEt)QeLT*dnOI%udJvNNOV9Cd?cmC4#MEB<`NIN#Y<}?N z%wf8?qB8ezQ2!`92~=I|$WRLkM{Qe2GG!+!?-+e*O{t2JAC1rd#Jef1nDMU$G_g8< zqkOG4K8(FQG6~E&jj^4xgTZIaCDj6oC@|pa1zZ}4M}{t32*~`1xmoU}($zCz*o~@n z6CM1Sj)1at#JOIUTO6b&1+f{##f3Mc=ZbU2P*=W$FX=>1c(VCJJ> zT&nrh>+*y}G>c$tLVkAta1hzUGk_hycP|7zB6Rj%j!4XTFdG3cD{P*wz>}pRi4~Q} z?qhey{+wG0q!Ot3lIG;)^=OiJ`e^%y>=ED z(L7&9?gK&Ulpt{bN%Tda%7KHx6!c-&E524{xFg}yo2yJ%3YV3QUO%rXeZ zJTx)+&Y^#((%RmVNCD(XW18Y4*}DZ~dnZz5e*9P7BfLCX}z&1y#O1 zMuNsh;2uIja>|88b7dzCkzx9SGT0kPVgkgr0>d_C#PlK>fE0wa9EGO}12>*u-4eoL zA0xe9AxQ}06a|takPXhw7pRE-qtM0wuI>BY^Vle?HU^#C^Kyh%Pj; z421fQL-=g?tj9T)HFD565Bfh6xYEAT0M|UBeq!UAGDG1iqIRcHr2M$k;cV)B^k)2T zJ?y`EHVo*kipyJgl%D zj`u}E|HZZGjhv(!nI*p1pySV4VG;@?{;dD5PW%Hmq3XABS0@&lgP@B$D&HTlI?7Sb zVk#4jWxu{|I|rYmEszLSB3_-et}TA%7|tALg5rLu86c<%^|(LP`>x8!KJA>lI(G|PR}7ay=rDRbP4~;`y*_8 zepk5atKCj5So;O!;;PHp&H3i|@kx4mSS33>8NkZTE$jl@(~@ej`FF0Cy$A@yEsfTk zpg4}^!8k=-{`Q%tk+Lhj%WJ>++dufbubw0dR4fU!XU7$FybweEnCag*t?Dpp3zKdL z%L3BroiCR7t;48VM(RP$ob+6y#AvT`L~@G(Vx8oio^OJ-)n3e;@QJd_pRnY z@=e%86QkCs(yuIvGNtC&fN+M^TulGkeZ9x}m19x8DQE`^&tB^LZ%+3JDpUCikZeu) zj8mm)QaY~SvBWEqn0(zE$OuCY$l%o!gx0f?p{ltE@FT|))LmvnSA6R&LAU3Kpt_5L zO794tc#=_#wan55i#k5M_^Vg`U&r8o?(b~Lf7k2(N1puJ)eSq91IZ+{LrhjA??4 z05IEav)32#jEo1;gnB0$O{#5=l-o);D&C^l-RZnKEpYUXFgt}hMGVhgSU#x} zU*CF0-fk8pP)8a+S7+Eg&cLa@5R^vYAoT~cGbyMJ2Zo`g4a9j5q7*O8`ik=TD9o$* z$3GVRrJ!3#Q#HOHJ}_tcS2tvWx?iO?Z=+7zK$}1H;lFXZ+vAa1-@g2g`N&n*t;B25 z%rFSCU*Uuiq2*4_Hz9rq13!K&K?%y~VwsO0Q4!tUe9UxdS?E3JgRu6PGlSHXrJv|H z)E-Sx6URcDOHi{9bJ9K< zSt>UVV}oXp6DjYgPF%>77i;5#6GsUKx(8lP!*CX(OxjM67_4Rsh#oy3aRyPRzc^w< za|6`A0&0LHu7^*++Gs@tHv`TsCx0yTtn?5U6f#yBS;W-%C#s&isj%1OcZx6Uc&`yF z6c&qq_c8vi+0VX{_IE#G+Oq7oCO*b0*Xwk@Srp9!`9v@tvy8`{T4O*iwh)%usD~jk zoxF1O($&?v;Tkg>;Sx*u7(ui~;I52Xb0(Z&$fLZ&TYjgnLL{d?NNNudc&y`V(6--C zu*uCC;7)&SgW@mh^qU)uv8${5qhA|WT%zjFSDzcG{wO@UJv#wYyiB=hCbor{^ks!O zp1s!G*ka(>R#uq909qh`o$Mpl)!0hs`{R(2o{lyCq z^|He+irb9cHu>FSyM)}U{a7;9Xr9`Ld41=Ai0>cg_e1dV3gD zP@p!>-S_e`E>LfvLA3H+=N} zgm*mVXd&oD)p{$^BA``pW;W~{1}$qA%@`TE zh@&&}^b$7vH{WbXi39DCJJG{#`9dHt)+->1lkF2-jC5k;tu{>}lw@A|rQJc6pV`(54eqlXF7vwhay3)$&MawI81ke1GgrK|VPLMJvL zkTDSvMUiLF_mSY0dkYd&P=xP;ou#_O&pa z$4fLEJVu{g@!e4gKgzC9sqD(@__{AHR(qr%Oh4S(hvWIx4-W-Dv=12>{RiqFDaR<~>ws|5M(0p+##{{8DY!3{2u zAnRp`=8zf=heL9jL?|x)U5YsnreuBi!uALNR>&O`iB{6m#CK=qXHEh-k8~hN0G`Nu z#Z~^!ZocZ&iLXtz+JeaY$emwYb#Z^uaR8@#Aa^t@P7cLc_c%~qP#)9(^NN~v5$RB{ z#&okZyuq_jm`(_cfvN!+LckXnVyD7EurA+}D?k|_38)PKB{{jvy%m^5XaBXUxC`+I zk|&(6z7mVOzzKi-gEqPsq>T!EjpIilCwc^s5+7DYzNRuFdn_dW8d&B4rb3icaNXZ6 z9&w{IgVrUS6|eUaix+?P_g^}Xzp+Ovvn;MYKSi(*8yL8P%FNRGGIfGv#}~c?f|Lgn zgfdcrd{J!vE}{m)T#tp!4JC<+#EeB~cC+uka0b9?w+BERNl9GPdhWauKOSSz$zCi4 zm^URr(GHMJ5m28I$iA9cWdCi1@@sck_jfFlb@7d_O4oH^8=U;xhv6-}lGSb)H3)q6 z2H^?vzVH2vzZ3Z>{>5*FC;qzRe(^VcD}?sH;#7m(B)oc%(vpS)Pqo2Yz?}+G-BGOa zg|K)e_wH@V3pyXD0FM}^dc|8j2eR_Y{}0etGgx|p0-z!V7eW^_uJm=*zSpyv{`KXW zZ+7}AO302YI% zAV69%x$G+s_oRJDk@o6e=G`IoFd-wpE&5X#SovyGEy#mfvsv`UwC$!cv?yX9<^u2- z(PgE7@Rb8!yTlLw$IIW?G8diP)kWY38yD!%0es6%!P5pMXHQ_XQt9LttjXg};JDI5 zPFEp-HwOQWE2BsT4fllJKm3kT{9`u_7Q@j!V)r3AFVNWh(k~!f$TLWl60EU6A|m_} zj4Hk6JX!N-xE4&;dk_3|@A(@&c~15z_b2`%C|Um0Rq^Q5J0~3pUO@I3>R_4r?w4< zYvqp~XOw>Y7XIj0exD`X-@JuTIcQmWH_A}}iT=`ZHjs)?Cw^o%s)LHXcMvwPJ@S=S zk=W{A{#vR?{3H1_9`p1s{3FS^&$t5eiMViFeKqUX8-O}RAXU57rk-P00MfZ3wpkzp zmCW(9+D}DdCqtTR5FT0e?UugqnVTt?uMMKF$8ommFG-BykoXy+0F_9x z&Ma~Z?SF`Cy8gva$@v|_`772w`2=WUbI)*+QLh zj-4Rl`OX%qbZ0oBalPFXZu2pj7H$b*n$nVOn%aw;9JatN{@_ah_ zhBaQJ>xtDIcQ4NQJ)GpQG^i0+K}2FJR{he~-(CFeA28~G%%@IbVu?RPCVQ*Tg#DM8 zp&xw*7-LBSI*dl+30#UXM%U)kbiMCEz-~o2g<&W>@JqL+AHWHU- z=XiUhS55-@cm6*V>HtsybV*t5=khK9Rso~_^;=nRCR-~HXKUO90;}(^fB;AGgy>6y zjH2Q6nRnOUZSljW{2f>=Hc4*~SJKZo3o`848Gt?|PqI{hK*J{F~u=Khpl{-z?h%$Dex;xfjhm z2WDgSV+MGHh{O;2De;Kg46Xuie|(nV*26?^1wqwu@N+b_-T2FX&S^w$qt%`qb1DDh z_aFa0qv&g_Hedb98zKMXt@+|Z;t~Z2l}j`d!Yl`4fLl|3wca z!C!i`<(F;jyN=}Lm%eSizx`GBh7O~gh*RTZ+tr9(=mvU?n>&-ovB%k?amA%5*7*1U zaiv=$t#Z8rM!7|4naE>z&(LG;iQiX#f}xkD#4ZY_n37V8!f!U?J!%lMOfn|dAbj~C zXO$uT`mOLTaMyT?vyPo0g(Sbn?2@w@*>6{$}oLOCmr(|IeS1{^44M?n4TlN^b!QTMq;ak zl*BG6YB;h22j@7*DAg8q4d5{_VW0q8&v(UX2B|Ip*M$#Gwr?4xCE}|w%8O2XS25d~ zo*oFrtClTF1F1~uBhQ6EhXB*IIq{KVLnEF5EJhykLd8LgFGR%JNL8~(VF5JqaNBlJ zVEBrh1KvdB&_vF|)sMhI?vH{dobS03vFi2$>rmMf@y_=hz3cExC7+uB&fwZF(p4OCl zd=Oa@H_I7}f-&AxUAijq6{RN30uiPp-d%r4#l~{nnD`x%K36|=;^0Q~YYQMgzqdu1 zWcb%Ovp+oJdaI8N(W7$u)v#kq`Q~Bz()1rmDxKz+L^sZLs=@n_~>m zKw7v_+He=v_~-roHLna__XF^i&ys+C{LR<%n120tAK=~1|>@oH-x5m){3dt}y}Xv_B;Px8sF_TX|IkF*IDP&-?k%>NcW`(2^lND%JWv0AA$0 zDZ`k^g?~T3EdDoR7nOfC_L0OlraZ|ZanrN%3PyZ^*?8ebc}MQ|a13rJKfOG_%Lwu2 z1@P!!{Qm!){CNNWmrDL$|D_UeX~3#m2LP@qDAz9dEf86F21o!DiBFO!z@;3g_!2p~Ng%sYv0|Q9vg%qC2rRITwp054DGXR_4 zWnq2ag_IpEQGlnu?brTvm9%F7>cOi6cc4Z9j;J2t4Lnca0W=#3De}nqws%tvh z0;noz$stcl0Y}b7f7g(xugnt$=FM~)i!P~Lk>OV58c+Ou%@LeQKGEw44?to;15iT_R|DWDP{e2= zdFlEF?Xc;Beah9Nc?So;HKSRBLzxN)gfiTbOuOs*FBoirK!E_m4bi~8iHD1pLLJLH z&;@A5S^)ZyD@QW``;L32W(p2E_rhi)L!HcOyxnfM>~@=PH`129Y#-b6vK_V?YJ1pi zU!T*k&7bFb%iOlX@mxHXU~61Y)ONA926tLMi?P+0G}yqD71$qo{6F*80no`B0G^i# zz710Qm;$a6v<`%hU*)3#hfx)(G|Z9edHD!(FB`rA^hGcmxj6G#2VmF%$jOvFlPSOq zL|O!(rV-E1pzna($unQbHZy{GOhZlQ1n2@>nj=r?#QPI;p{N z$$bZK*8#olpvU=0&*WJgh0@@D!&+S$A~cQy8X*dAU7kYDHH3ijM_77+905-8D%+>i zOrH5DuhO&=Aoh_sVxf#=4Y00|W*wJ>zKte;Y0mNuA@J={6<{Do{7-*w+Hv1@`r3{I zu8^*D&TBsHzzh2#ApNClf8dphGa8MG^Z}Rv_Nnhxp?CyHiGYq7a|D7CbO35=TO^Jg zuSfO~+}HMSuLV(xfoP5#ZxjP?K~Pm;C<5R?e;N+kq=0HVNCLLV8S?3HQ9L&w(uRHrWM zco_bkJDVBdJdeoL+m5g(Z=^V9Mug@O*#?qlGy-IxAOa|;ZzJ%{5%_3?bJKUA?Bwq_ zP0W}q1jH+Y^qY@ZgkjhM7%-6k8KQ1AoS`H%x)35)-N24f8VD)Dx@Fq z?dQ*00GwhQnZ?^9@Il`Jc3uB6r7j#E0iZnWBR-O6Ayjj|@4%_+u#Bt-mVt}=4uX!n zUq)!;C_`O&hCI&(@*{vT^28_@)SSwB@)+bE>HzPr{4jgi*LX;Hh0qT-Z&j9?B8UK1bH3<+ko~1h z_!nRXjo&`x>iaw4|1)PD$@mi@hyIawW;AjoS$7x&Ia=qm<6-Ligb$6BL<#V-LFSh0 z0N8Xy&)|OfSFlIWVSp^p3OXnkIEO+9ShA)Jd0j(t8fbAK0-mIIaR9F%+^lqUWl9}^ zFHQnT+fMFUabD-dC-f5RuJ2&nb(r_mnHfbAzm>VI7J*RHcuo*den7<&cEir17T{@Rv^z{=zx%r{e!Gq4UGlinP2Nt zsG;TwX(6M-2(J7pW3&kL8q(7a!hEIa5!383a8Zvu0Hx>p z8n9(bPOS)-gdQAOQ#C}ghzMk7Pu~hr15zYrSI66GUr$t!cdQtta#i)_N7q6P(xjm!|RZx1P|qT+;|5nauF4Jd?dV zO|2QE9oTchk*rA~ry=$=2m+y6=PE!(X2NcrA3gsI4`NodTy+H2ZPe}e1TpVfUOM_# zm#?t%2s&_T|Eur@8dD?sj@wvy{RiIl{>3=V5!l1O8Rxeiz#H{*=HxHA&UOxlg56|V z1Q-p0lg!8ee*78$nBj?h*=dNqUJx^yXiP7J&i{6wKqKG{GFM!%qf{0d9eY z=f28wwvZ7xf%;Ty((W0^h>E26)Wy(OMSB zp5~9B{wK7z^>jURIiM! zitJgxU}5f$(Dsz?zErLsum~8v_{CfQdY$V7vA$pAh9&#H7J=>G;{D=ewEvlVNX{y0 z*#0vb>VJ5U2OW{|*2?F%QJ{>#g}v>2X?hXLp>qHfi2UREe}v0={Eu+*zw57%(Oz6> z(}F9eGh3u#=p%6Q?Zc!4-X-!C&+};J-QUAvkyicz)Tz)4=xNVY+0<%YEO zP4*qH{xiOLo&eXhTFZ~X!h~KjIg^-km#w_00g;>uP3>DxaMxNelD4)@){C23$MxJw z&e>3~u%oqrQFCUr^Z%rNUgOkV{s?xY?2x&(o4(_zRc>0gPUN&m&e6Z#uSL+*G@z36 zgG0_W{Hg0w0Ia<0I{}bq_G06CRdtQhR0IzUO*Ae^57cN@ifUv?{(Y%ncf8i(s2Y|c6-8GHa^?u;y zc?JLqTw?`TYwoljraY|9$?#f1khb-{+a&0f0r;v6zx^kq~}@ z$7{s{K%T(eaxyOd2d?{$-(BIl@A!okF8Yoie&N{f_`h%;!b2C-{gE3IAm_J}dW3+q zjcvkrW83jOfuFx?l(ZQ}Oy)__$$9uUd_vB|&Tn}72Oj=`4@m!Kb^aqel9jiqw&Pbh zz^*vi!-xsrNaYv)2oZt3lQX6B8}_JaJp2PY5?p@6K33e>zpk0h+IK#TcpWRbtAUMr zgpk0e=nLQRa;rrMu6_T4m1WZRA6SC3^Bb05`N%2rW%*O)0UDwBrz`+ohSs05_;>XNs9Bi(>E8q# z=FR|eKsPDGMplV>_fArEnqmg&592EI~-V%OqjaPe;lDA(?n0a1`JJ5RC*b1|bG1 zdA~;RK>(O!oP0;xxnz7k`JNCNH^E2J$tN7DpK;XyQNYHKTHjC7zKJ@pN0^aN&k)0a z#4)?1EV6`-&Pvaezy(0V|A3$WQ@@aMG=9ggV=xdpnIlLEd;(xi-j}TJJ%QW$UiLSA zlayq;V}VIj`W(rV`QOI}-}zm~v*H#0;N^~FUP|)&K*k+n(2?KmpR$&I`@aCV15yl< z5e#Jhf)($SgkojHG@_;OL+}bmumPz2AHYBV46lyRah<2&AK`};pAhixqT9P7OV>|8J8!s=yvdm=d|9AWL?Cg7+KmOZV*Y$IC|Bol>r276c-t#o;|AVEd|JJqffBfxdPsz7XnO`41 zO{lY|r#}X5lr;db>!U+5Et7X4K9Sv)kGFu3c9GvFLL2R@hIref6F?YSRpex|rH-rZh7l4Cp40W??c?44=VEs zUcyi%$H$(LZs$r*UTUT3{B)fB;QIKawBd)32OW zQ3LhE-*+tP$%m&NpW|)=;v}m#k59!L7d5lrPZ@fBKPWZRJ=YpX<9KbK&htu@Ci-lcUO5lm=3d5UEqS=9Wd=As zUU#mtr(#@cqE!b>;M{N7+*2f1GUmpoIM`hQ%)YG=0nR0tfB(pDv zpvvVgm-EHAd>)(mt%FzypCq{Ya*m185c_PnDMu`}r~4fha}aOi&s}21=_q5@M4!pj z*mNuTkK4)frTGFz?%V9nk!!JeJe3BBOT`sg^6@x`%k~|abnG9PZnzBEW!D1h zBo*8G!(0Yuxf_EizTLwiFm4h3*>aCfe?K2&cR=}aILO9s_k20AYU^Z|d7q+)8JY&5 zjdO0gpwR;?&zc+w2QkH)O1oU1EElk+&n_Lph4R?RQ$pUBRKa0M9#C}Jy27$W)f9w} zc+y_{Lpr6Wr~l69=q?=Lt3}oU`F&%_Mt#|361-LAL2pv;a7e*;Wanh}G>mbUMTyR0 zmin~b!9FFOTJe#nq)eHguk!ub1Q-94)cY`(HoLuk?si@B;R{NM8|z0SL5EP&U;U> zDmC48ets411$M+BI~h7}-@T}xOf>O=f6(PUmD_XZUi}WdDkm<*5jOIMb%KjXeYEAH zOy*OlMtjGW%0xOM@>mHK~qzsX6m)BwbEqhHZ)pr z(j)a%ADaC`sY*qCsCDE_v|Qb{k2h}oXycs9gZy!;g}W*K81C9sSJI}pijZaBZ%Lm) zJrzxH^%mU8CpTAG%`N+qc`p`s1+J?_Xm8ruA&-^jXhmkxdAoj&QRAGl&HjAv=?N{2 z+)=8HMA=jAJtsz`)p?K@35@2}(OI$&4wHl0JDs$%aJuG3lAnOV)mdKzwb|}kN3fDl zpB7%0^ek(l;S=t!i81$rKn_tGyJ_PHEIl^h@GH(upz#Y_!1sc4$iP)t3y{cRsxxblq zXMDnP5t^WVzD0j25I7su6R5!$3NPFG*zf56P=loo(SdcQ}X3XQ@GPQ{(QhOwb|pYJv=|*4c{!0 zfzIp2`?HXG-7VINGOcon$MO3HwY3NH zTE0lCx)Y4I;ojp)?7`C>7OLs*PRt62Hiv+H;Q4Z~E9qVAp6+5dy7x>KKL>}n=iQ5e zY+26-GXN*=){6D9+=JJ(RSnsCo{mh^kGN;VTdK0Gy&pDCU!CwK0YyFyT{XB&D4Z8~ zP#_eZxBE%M^|2Ib;q7TUZJ6ETae3_GGx$8zb2yy9?heoQyn6={E4Aez+i|z)y4VF9 zLA$SSPdR|@zPV);t<%yy?RMhph;)Z?EAgN@)|`vQvsW%BfZU6WxZt;JXl&O2so5pd!a^If2)WMy z%*d8&S%xm%80yt3P&nUj90vWptN{NOD{;ZM*wD(d1v{&u)x9e7-FYyu=_QWw1H~9Q&pEc$v>BxAHb_}GNLe)4wza>PYJA-SFEOv#(Y$1=dC3muC4Jdj zZI`BVa(ASqsLqSm4}9?S%jdAe_%=`P=N`3gU%ly*K_hnHN|cU49JgDA->Pl~_a8?Z zfxH_fEm#29p+kV`?d1Yk$QAhG0IoKLfuf#>>R-WKR33dWSC70whnL0(LP}%d?z%}d zv;4_E_m?;=bEi_5)=Pl)KqGtdsQ3O&H95_0(b5L}>!eeW()y|z!YM!R%X7djGsQmo z?Jm;vry3mSqyp;YmL%Fai>yN5wV~%YxPKi?C(*RG|K6}Sfi?~(lw&S*!Lcw-pT_HJTw9$22D^J#Nu zUp#H>-*eADtk6$}n*U&MNgS6O_4vV0kqutkx^_A$m`A+XPUqdt5AWd6*>l0(1$Wos zK{7MEsg~#V?bf&Z_B>?MXHz{VXMB2RXTRGsmigWcvwP^L^wM4#zb|gDNIe~sPQynC z9(goaw_)=FkNonw*V97VuP2PSC*3hTtTb{8GbX=;nhyF;BM zUTP?L^0pPlzV+st%CogoKP2u>8T!^dxA*9LV*5Vdgk8#4Xb?+Bal%8AJleK6)jQP; zHS1y&-i80f+edv;I6;?gPRlWlIkRtU9X5t18;LzXcSt9nOn%8I=!)Gt7q@R+yk%;P zC@x97wmsTM845QCivn88e%}}L?gLNFIYzg=Gbx|vRVj@}uA2Md$qL<$tvff?itJ$s zMR}->{n;5dI(1CqakA+}4DazZ5RxMd)a7zA=07@+-RH&`VR;^Mk z_UU?Fd{JXfJ9@ZT`gmyU{_y^!4cEB^Yh5UCR!iYw#2u>D=kag}%)U&;B{nNIXZkkr zF18Zxuii2idrbR7M!8&&w0=plJIPj6o*B=EaW zk#G9zPQ%Ij6EXBYwI3VaS)K^=rYH_P>ujbSJ!!Er)_1x%9IjDLO?8@4>gITa)6~9w zp|MYsZFo=Hu=3aWQ?|Y=-mPmL%ln}@&nI@T&<8N7=Y*Erj~%;O&D}6FJ-mEU3#`otykX@mxG;{4v$l7X*K-T>!aLg3jfTLtAJ=5MM4~us&%r!M zhb>CHXU$(fS6cTXIlS)cbj!fc%Mc{_=d8C$=|0Bz`Tk32~gfxm8Tt26f1qHNy9+fpY3ZcMc!%uZtZPc;D_Zbx}|DC zb})p}I)ui-%63~1i>JY(Kkn7DN_9Lk59-do9KmOiU5ZPRacv2L$d;qltsD#Z&ND0N(? z+)63FvGml~@3(V$X4EY>UinhIRY9}IyEHdy<;8beQk3F+IR^c`jwow#*Q9lyp8+TuighL)Z)}*QF><=T8?O&`_G3> zLh6nK?M~mZbX7H92e$OaSGUFMcw=Rb%-X2rw0GhFBsWfLU76bj{bRXOx z-{$d|O2wi$Cok4w1u&hJ{7C7EBBaW05e#Wq>MYtzbjM`QIVxF{nV^{0xy%P(jL0+S#BZGPG zW`=!tx;dwV1U6kpXY)>ex9+~bIojQ-Z;LJ7u>Zbk_jh1G{Pg8;Xr6OMjRHO{wSN|L zSCJp@$0@xQ7r1#dw_{W$)h)CPQS9BgbRL*itgb3=cC%j@2fXik!9m+)W=kGelw|RtDfyA4{p+{k+}I>!iz)SjLQw&UgF_q z?hI`cP%b0hZfIDJ_wa6TR{gmu+0kGEB~O@}VKKLI^28lqmhhVMqt{^0xH8(NO6%Yd z9A2Gk$xEK9$IRQ4l#cK7^^zoc1v)CO`ogb|`sUh%xvX=#fAojKin%j>x{LB09?j2*-G;-d2RtsYE4%H(&2DXqJ4?+w-V%Ik@{)mNLv z=VkBiOXh@{L+#pzUQWen;;q_AX63fS&UtfqdI>%r=T?RFi`s>sLrtfhyktg}4HI2d zv)}CQy{u|aai227a1Fg(GZaV8WdLyQcICb=+w^hfKgxz}yGAUZd~&?H?fX{qCRdg$ zmF0`!JgVrJ2E}>2`H@!7V%eN%n{SqJn6Vh-vnEwqvd!*K=lQnF2p%8Zl7BX~U0=4| zMR`3+`Egg#loAHQ_ugGrfsB#N${)kJ`GCThxvu}&pU3c&8%NR~H zrw5I^bGKR~F(x#HQ9C-rI-LX%F7zDDGifmzQP2zIiUu@v&p=2hSW5<_G|LyjOf% z51Zm?owib|)k@~!+>Y@_DEUTdZv*rAD7o>>{o?Icf$*M``OX|CugcE-{UG|=EtA4y zYo{$Ol;`O=s8`_kK^6JQi*?VJyL;bmhwaDNrDsY%3e>)?5B}5MRn`M=#{JMw3DY!u zO)*9LnU2Y(4U`7@FYi!2q2N63y75X+*ZX|E95+YXY8CC34c8CzDhjQilE4JVQ2S^S z^`89a{xRY6Mh;yud7eOWw|hl9WseCm*NIKfir@S6SuX>hmcpnmjB-Dq!xIj*D8|p_)-wwF zOnI_#>+o{W@6!o$wnYKF$hRfg`P6aS!>d#Veequ0Vx!r?CaUZSp~G3RbSVT{3S*_9k=uRj2c#a(U(FenaaYMvt_QF}nvTe!PQ4wbd7Q8ffXM z(>GXIz1+)3>MRT=f7$GI+0lEx4)AXFMd_ZKIceL+81tpzZEt>+ye5D)oAlKNcl}v9 z$`PF}@{#W2<5jpEZ{BCSaOuU5#E+Jk@xISf=iQV&LbNg6haI}xSG2dc0q6HYZ;&W7o5y(mp2#E0TF2HsWE3FgLc& z_26lJJ3e&70Zu|4S~-@t>`t0fpgi}M{mSKYZKDq#ax_Y)G;j5Acr5pe@DiL%R+Z(gYn#uh zl-twn?~Tb0HSrGKM~{*mQ$2LuTawb0iKZYdOodNG^CEbvo;v5sySzDp>vhD6SPIj( zizjn1uRFW6ub$pG)Wuf#Pg&mMs-_f2Yz{~MoyB%KpP;p268Wfm14!oE^ZlxL^SIxM zROOzI$8d9Now2W{GF3dF(%ih&o|n5pKX3PET{|Zr)W*G-A=c6MT?{l+o9B0E46a>X z?UH*@laV>|9l5FuoFhdaoatS;hUGWl!pUcqp;a+>-{v{5Oew1U62hmQ`vaSJ-u$Xs z5pAAGKUz^_yA{2k;q$o(kEfy9UH0R{bDC=-zFyC{>41Km2kgf0IK9#|?@v138pd`g zw5pA{VC-*If{50whLgXn>{{;ij4m`tA>mV4unGd=IcH)`*k^!G;1HXQfh(VKn+{5ZVgmv*GD zvGjh0*VtyW<&A1uZoSv?ZdzI{w2w-2wz0T7=`|Rhm zTe~a7Wo%k*=jhmw=UXICI>Kn?|#v!=es9Su|4)KdQ^z=bc zKk9Ch{5>Vq=%Nc1cb#i%kCdfT9lkLpQJ%+_emX^yezqh#PzSY&J+yz@O#iQy>Y_Ixfz+ZUD)=FeUWd!vV=pW65H{#{4)M?a<(qCe_B&r&_G57{R8fXa;S z#atXsCBLx@GLOaiZQ$YTQ}#S^r9bp>H*34t{5-uHoudPVI%e!%P16T*(o*q7XPy+z zdRxJLJumNf_KJt0Vh`G}y_N6dTx`ttmeWkeh}af*RW}vBHNr&P>(#Z^o&hU8POsCT zN!-zI4rO<8=bIGNH&zwH3GwxNy1&OcG{NUoZjsHI%l^b%u=zNcx0t)V^4rFpbi6yA z^<`&hr5r(rqc}f$Y@#Rs(fN7n9a&oBlgu&aeb4T>`;BV?c{ksUXMeKV_+w_T=f|L9 znPIVqHpAv&ojEES@BS1!iD4h&Ee~XOm!I*yW!!M@tIck#t~Y?pq@|y8+c=htoD4PbEwo1MUCL%*kqx&p`Owg z6Vqcr-0?AZ+8EKDEHf;E+n$xg@>e{Boa^a7*u8$Ubw!nEqH(O=XHyKKKNzSu9&Vu2 zQyZiWT<<*{fj-kb63cvI3WSmYE51gS8P=JzdGC7Papd^4!{~})gGDsE>;3Tt*;5h9 zzDts*GlJbomvA)=F86@&7$X8?+7?mP@YzuDu+D9a-0x@!U?~j)VpPw&)o^qn0@w7+ zeA^<=-nKi8Gvrv7l#^clsjC0*rId{4axH121f?i+O|(QVI?1)Bh9iXTS-IScY2tJe z(2rn0Y8zyZ&mUpCvfPM2{t-x?~iuO z^i)l|0q>iB2Tt7?J{TpD%#DCu$3}HD6+>>)GW?aIVAC4x`25Qw!x({wih?6DM{^e*McB{y-~zBT7G3D zWrx?XZR~%+3q*{#&qk@8*gh8D&sOm)+nHhX$<9dS7(+lh&YwUF`!?njcj!wmmDu`W zV$#}-?|P2#Sy_qnLwU#@Ya&%-4_Goe3JVpYPl#z{!pjd;dTRobjOv7~qUAh#lZw8H zegjAAOOXf@@1P&7*og6Q;St+0q(B%|7Ba#?o0Fu45w5wTc01_i9=~IG0Bhh1*;^+d zSuRFgP%^V0(Bh%uUn=}X(SgdHXb2oGf?QBE{4hbtB7+|cX?vemYiaogLceEry$k4Rj9 zUnq3l{2mNn^jto4hD+BBLWM_E8s_Mh+*_*|t%W~*JG5++>B(A5gOGGs_r?{RAg#~W zLUog$m`UK`7Pu-Z3JbfH%h-A{$Ys75Enn_(k$BmQ>j1lm(%l*P6N^5WAVFwS1f4AX z1qd-O0>cXEnyQ+9ZHJY{t8P*Y*gDIH*f4vHQLZo4i@#`KY->q%3I^}X+Rt)i>_yyN zP#Kd|Hv|5RO*tMX3z|S+pdVvd<^iXI>xVh74gPRr{(Mj64yWj@3tbcM=o6o}S-NQ1 zXmHL!x^lo#ZcAt#e-K*TEF|7~nMU`gUwRaN2ihlGeoA{TOC6AbkvkEob1r=*crToI z(0H@iN0_jN5I~|Hv}n6`UXopW)`C+z+H%yltD~1a(X(ila7oaJLGGP_Txx;#&we=_x_z_OZ=lYz7$C_PifLb~T>1Yy( z3NRv{L6t}Ao(cYI`=urTQU&CY{t5C9_R!rJR;;ggP2%H9_%I}e&!gz5hbZHNny$ZS zlXub-QrG9N>!-M@Ob}6j2C(-(ZLKmYIkVsD!;tJW_D{TpL3QB1H&YhyU|MD3&w{sU zdtiQ(e6P7on$x^*Ak9A7{Id?l`2#gJkEOlW>%1xXmPS;cDPmTNv8>gqeoJQju>`fM zeKYt$H(c~Tm9ps(p$4?^-HIkJs7l27raFu}u%I&lrr~+QmxA8_F1!c3=?qYT3->P@ zv?ossDP1;~q^J)&?t6{&kkSn7@)OPGobkEhC5f*?^CgZImV!#^mGw^H_T#w&NMmL; zxO(?c>p;Ci*(W-c%jgC%UkcmlmdvYoY@M?`LjccDni9~9^CG74 zwcb=td_{(wNrM!`6OXSq1=Zt9)!OoRjk`T32EP_0Bk3`ZUwpNA98p{$=K!P|4P|Y> z2qhzih|AM)e@P={m)L_Tw=}sUJW40GQg6tC1bA#~-B>h?XB=m3Z7k06_teUk=nMNf z>{)kc2yspJ>D3tt5gW*hK#;0*o%L~_-~Ctzeqsk0y4>hG!bfxzF}j}mn>MrK1_;ic z@z+r8ppwMS0k3JLo9WoCMSspLQ)A-9;EqURYjRzd;h-#WPjSHfRd?%xugLYOAp3=K zpW-fN9%bMBM#m6dgVdBzb-C4(H=OaO!^KB6D_sL&pIj=lr*OFz(Yk4!gP6RQgmajY z%P{)`)0oas&_%YBvD0-WGQbIW2&5thJK80lxw;GkX%s$g)Ev8-U4@G$r;aXMbq9qy zabLqO5gHMxvtHxNY;JUCUJb5RUS(&Gx7JQSwHpN)NOPtG@fsmBEeV40l0jhUp{iWn zkaMSvE3zJ4N7!UFWE7*Gd5&LH=P)0Ik}&d^WjQ+lm^ZLn#RJOx+bh`R>@G9WKQPkQlPIkwm1O^+0TUC2EAgj8* z2^0|lRF}xx&y*ZVKH0>7L&idY%dtCkKoti{l?gE)M;A%A9$|DAxkyLw3|eNr1#l0O z3o&i6^ZF36Dx#D09$#HOJ(r8W|4Y<7NfJ_l-(5(T!WYW0dgDkT@WsmSgs9s)jUmaI zZU%75!>0< zxg(9ZyZUn49gE}jhqp!xH5ad7-e*HJ)mk7CxE8Dkx58lTl=vXPs}W<&>|nCb+%ev* z$4$jxzb|)QgWQbA;u5gmW!>BFgc(DKdNs(%{k35eD)g81BJyZ0c5ME_4c44E#^*-K zt3YUtZB)m*E6@od`j`QXQp!s)U8Raeic=f?BfG43Py%a6S(YhlG|XuxFmlRS+|9&D zfU$SzfM-NK>Gp`RGDG;1R8Zoug?Nv(($1rpG9@qSX!#3OqQJKM@$SaJf4*aesvEw; zx3ofd>Y@Yy=B3Ft@b%H^O;P!BZQsauvpHjN_vNm+0+%dGZ|dN+i)&Ux^_bO{4{T~;1XsZV|Y&IA?=v{FEi?Wr>!kX46r{U-9A zjNIL!PA1~n<;1t#lOQl$C;3q%#yGu@jfEP0kgwkNdh225LiJ#_f*$mW?(9psM!(Ab zq}yBzsE0YE%SQ~*iKU7HT`Qt=n4Kwc6&fF_I+-BPnr-U9Hy}(KN##5fgm?TG8Wh*> zX7PbM)33qcgYU=^I_1|^#VMWC&zjb9l+B0=HZtulix4nqrr15o#*c5S?ybYErJ^jw z-VEKSo4uf}?){#%K4>sEd%Ea)i|YlV?rNfSI$dzcKEx}J@%2g+_9?;-*qOI*6=ppN z+!E(X89@r{ixEiR zYCNrO~`3k=oMt#vJ7V$1@ph*vVYjufBWzMN`DY&e;~d$>%`LV2nMV@;v1CE=Po()Lt8g4Z7cn_O zQ|J$W)V+U)`~%~nMgyf({S{LACqo_oj2P@cc`9Zk9ZAV?WPIE}q&S@kt4Cnnl|MN&Q4ChGn zZL*mJL)D)i0QqMa!T!a`u056Ta?cU7Wf-QjnE#X&^Mtl1b@_waO8z@TN&ZX6$}y~d z6HfjUkJMopJ^VXQ8vhQRB|B`!=gv{{Pr`NmyL{*Gt0Xo?S>r+3H~n{i@4usde;>L! z-i; z{rq;M;F8>KR)4Sq1L*UY4sD_OZY>7K>&~Q%S@L;=AzhNBO+0b#EUuQUojo6vD4>t1 z#u2ovDZFY+i4aq;cPK^g0mueb@dgzIhfupHi~7dY7Fe#Ny6e#^^ADQv%jl=R=F`KX zq%1hIA*M`O%G4*LwD z=CT&52{WYMyum;&VgKclw^nc7ow0w7unuT64&YQg zlk$Q5z!9jrz$I&f8_JqmWaT3S8=Dg(_^iEGVsyx#HjNNUjssI{wvn{7;k$w#f@cf+ z6GMct_!iF={-+k7i(S#R`SX<9hX43y0dIgZs1F|2lV53O49i?Kf4}n#D(P|!*{;=p z#WPv%hc{O{(^BG(xryG8Qc z()0V7_N^`^DPz&MDqz42t6zsMv=_v_LI>$fw2i>mx%! z_BI9QsI(avT_YTQstduTn#T;+Py5I^`zlFHH%gW*&)x` z48(#PKGu+?OVqsxcdt>?aT;=Jh&yKN>#Vw4%h`UlHdP)i+g zA%q!qQ;Vb0|s? z;DrIYj7PSYNRiy%_iXybZ4{!@_vz+g;V6~%8BP5J2ys_=gRK4oXo}qY-~3E;U}#{I z+tSW`zahG9*CdyS{E-qbO$3Dt+p3fUTE^u4`qo*5;Ta{Bc7fe$4mW-u7XGp=i#BWp zYs;jjmzU|Bo%c8IG6f2Ezj{8oTH#INSM}eTCnj`TmWPDAf;sQA&pX8_5s@VzC>GQm zAFVt=Z0!P8z*A>agq;){iI(2ebhf!P_|;yxqR*k#3^A`qSX}#7!wxb>{kSy%)MW_r zS4|Ww>I}>bD(C97wu@B6w&r#a4&g-9K=fVd>T6lWx}YN}@Wd$L6q&!__r^3w%q^p?-;`K(0=}gyoq~A!UfqM2?i4zAkfPN%A~yr?r1+pbFyH|3Es~b9 z8Vr$YZ@sAL23mrQNQ;ZN8pfoWtF37zj`bK01;6!idsMZcDyj^v8-7pDj@VO&Djn>@p1z5c-I1KO%$ z14mH20mh~P=-qeVH`v+)&Q(l<^L^L;;x_xyQsm;v{xA(;mShb7%^3#?!Q%y0Wx=y9 zvmJ2LewmvJ{2BZ02O4^HyMKsoH{4zn<=eGQc^1UN&xp3yn_IR^oDOLkn1^O|shzM3 z$Pbs>^8IYiLjbb#Hb}H(q`kTPo)=gB{*^?JuT@=Ja!DWcJ||u)3Ue_0Rk&*A72Jg8 zRwz}D;D<+*%Q`)PD3_zV@G1ntlG!2G(HA!$MR;v}!bDwF`o?gHxPr+_K5}YWP>VF*hJdf?lP99 zSbL=CQ`~7Vtk!AZrXsGdtC_JB`ct@hshv9O?i$$ImZ$(=i#a9lBs|P29EW!1_EO5i zFRU~%FwP8LxcgW0ZXIt$MQ2qvGc!rF-({Zs(PL&Q#H{GHEU^c7N#Oa5U2gY#_T)8o z5#ls8w~hwJf!V97Q|b*K#?{n*zcZa!Z$Y${pO%Q($QVS%MFzjMcs97iqBj_rp~yRDQ0`=CZiUQ-c5W(6(_!`&?|>02Ib2^F`;HP#OF5( z*gqJ5y>W(Nzkyo5HCWDG^LFZYKK7Ai)|P}YTl|aw*$j9Z%-a*TFAz}v_p_^0c}Q9u zAHHMS)KNU6HRXe<@?=JT4t=2@ZakulX*IsDkvdTh4+N z_SabH_9Yb*eg)b60JbG+xCOhWH~G(a&jupKH7(;8p;WrmbFIq3s}Jy-AJTP`D*KJ1 zPYkj(B=#gle#_O{qqA4pDsgK~A7_kLoav=aBE`U(nUpY^O5HPeRhVH1qLO{fT~q~) z*_~bVBw;@AUE*|aNlcqwj-{*~DC~>SntO;gbywTg_lV(ec%E9_@lsW5*MN}y@7EwT ztZpd7=yfSl=dYUfkMrvgudj1(BO1OT~f4M<6yfey;f}!uC#B zG_#WA6+4w;2E!o&0YLFRn3F_pVLs7F&dIG~Qdt)Vpg38>KG$u(wE-K;!v5uANbP8tpqATNV{9WA*YY zL$3Pe!l$}=q>NbKD>c}H4ZgzmH#B+MTkSVFer1M~sMA@l;KsaSOQ4`tr$( z;awR1kc8U?Bn#k(tO&rA_y;TS_?5nXJ*)vda9)s6Jz3a0`M!P%!w+>eUI22Ut9tm#T=)M_{q+uHnfjEA6QuMU~HX z6RyP1KJ42TB?UikJnA}PlZPW;I-$#+j&SI$g=Nz=4DAh?5W->3N8tF6?|!_!u}il6bKF+f>4MZzKW>C0A{Wu_7xWF(O@(>&Zq z5*A_u#=ezG{lsfM@Dz{_vu4Lcb1fGzGUaz`t3+RtYR?ef!qeh$i=-^t_Bi-czTa`D znpo@|Y-W@W*j-3233a~ zQumJuTdn%($z7Br`KZ$Zq*29w#4Glf2{J#9w=ufJ>5SjDC2&@5fKe%I6SC^JA**utRz1HtG^2 zP7_HLKBJ>=;@5o|0+OO)aJ<(yj9qHI^MJBw&t)!s1WdxBb73w&zah{tt$QgUN9O7T zu$0R5b0o{Y1dCrfmy(HPjxNb*_fo$r&Z~5L;0N{L5D+K?%Nnu*cDMyK6U%r@X1t7W z?4`+0>*|AMtUJ0n-&(t#uD?V(Gz>$=>Ib6={UeyKjR5}iP4+RuFPvlu^t{RefO1FY zVk&>>Z17f3fUJ+AnC8%ea(%%Q+v0DAp%{2N#+py&B%4$wCEquU`ztMdyDrz9xb5CS z94e=KRqN-`-^~4vJI|OCfI7hBRX^SJRGjzja2fX_j;{}(!*rYGH+jFL`^j;`bENXSgo35NUGSY8>C>}$I@5=9GK4ha zWhPfzq9ePKNVlkPsdNiHk~A`MR?TE-&_@(}P&kqo@)(?>*5h~7?Q#6+IH{u$s18(+ zN{Qk{=#i(ZQ$aO|A18FJ1<&)dPlt~SmiZE3F~ zvt_*(emyGH8F9NI`rT3wj{h$_3F+pL*H}w=#Ele!Htp|=qD;P2l7?}TJXGk zyUd@EYPa-#-4QTz>SF#_=c}ZKF6l_H70boVO$C)QdFlY{#V4x^Q|Rni-rmA5Ipj1) z{Q=M!HOe=arz-xXC(%mDYDQfGZ#0Rfd#rI`1{5QoMluk@>92?Zv z4U_?bg5R$l7*1gpeitRcP#5nm%7|44uEcTn zGOE_Ic|0Zq8-K_BOVO~qdZ>*`-p%PF?io?rv#ce9NMOuaV9V_Hss2cM1ne_*Z*VUF zs0=AYmr_RO5y$A=!dK+DgI$k1Ktm#!>ynmfXa2~;{W-EG`@ZG-=W+V1$`iXR{xF(X zc_#G?bYuo#VH7g4GYK&_Ux$|3CpnUkXgBwS&&!Q-!whF|`cr0u!Gkz6C?b@&;`Z1( z%N&p5Hx$5xle&lpL-4TWz(A|TAq|l&8uQ2oBomSQ8|J>gVN?vI-%AiDf^#>Z|0cLh z<%PR&T4cr8`7GB5ic>-{o7M7xjzOJ$fj^ei&7@zWcK+Y%fxK*6gqQ zjKT}{k|1+P1ouxajPls;u{0Lw1ajMduAQQbrC z!x~}YqT+_FFh4*BZm6g(CMAx6u=B0$=p%%8QJYM>*<%+r@A5o^B-%L3b-2j$L z_Ql9Fd2s-5jI>7MStR+*_HID%p9->nnC9%Du&cr$JW2Zz^m}%C1$xkKjjOz7EsrL` z(wEGzWe^FGxlYIh=G4=MJAjKn%Giol%3}q(wGI`PWsED5$>Sq$3Sp&$Jq%sUgD)-U zsQ5>G%w4PMcR^~DB@xx%101p%yPuMdJ@_Ac!slvMST0mV9Lj#-%GHqSlnFhkD;oZK z{6$QeGXtpW6T`6aAM(L80c%v&#Pp}S`yPg}wNjW)q(WZ_z8z$qOTM>9eC{VUJrt4# z`1Kak{j?*D)a~4-yRB7TYgC3)CI}H7*d(Qq;o6%f7*EkkhO?*g)n#YE;ipUThC+Wd z$2I}G*W(U9;gPe9z%2c>kSr%phs_46C?Bh|Nl4KsXYS{4*g8jwg`G_OIOjR@-~bH& zc}*B}h7~ft8~;{*y2MDW^*Z&xlZn3HY@!Z;TCSpA4o;@qRMsNOK>m8J3XJ7DKzd9u zJVVU5_jpshNOh?D8LcaQ1fgT`CF`IE*MNBUFQu#tgXXL=#*{^y?gv#Y2a$Ve^AAkI>Yah6=W-c&` zt%_5XUN^m`E2|7!H2%#QpOlmpIjJkcR?uJVKGx&Z33@NJ?0X97%qu_LU5Wx}=Zc*G zx`VQMWP{vI!~9LJ?Q7$!4eJTv&5BkURZQs7r(_#bk(K$a3_?{nRK$9{bFpU$RQ{_p zTv+77lN8U=z*#7*=*QP^F%XEED9`Hq;JdWrEAm~5`kH@*zr~H`7-UJyBQUch(}$ns zmXv&K|J;vnXCAvy)-coo3JWqP##_=#nHcQ2JbSfi=q#=4M$_`s|ut{gU7 z9dtfZwxAk_2HZ`w8dXd5;CL_OwcwUn)H_5Q?|0PLN?s&95Lgs80>qWQyls}*7ma?9 z`k~YS#qm5Tmgu&eU>~B`6gcGac(78t7zmhl8zB@R_wJWFw=MS;4sbgbxZH^XH$r5< z;?QTa+TqcE?qn5w&L5)s>!b`TQMzF;_M>$NJp{Mvh;m81&5SSB!#NN{Fx(@R%)nbt zhy>O$2C-$F>qfgLwD~ zb!;A__PT9QGg}j@Rd)UH9w_p2*NA3}m~4j092U}w zzw6`mFdHRdgsHS}r9%MF$~k5mOa?(sjNji%0()FMyje-?o`-sO#o#d~^&aF3Pzb7w z8kHJ%{1aHN|BKKA3p5FoI+%%MnU@BEzBR&EV4+pJ@^8!_Qw%Jd{R$~RT5m~S& z53n2`E=`zVjU(Ze|48d}6V#f|A4%uU6yz9ox$gBlmYvFF=s7{3^+{p3yJe+G4e|zJ zml;^_@ZT6pR7_DTFn`!%kPP+76H+=WQ$P#7P#MA}-w4f#l0%@s9ksn3-`H~b83GNG z1F|lqTwGnV^(b!lSOlLU?`i}uY_F{H)0S`?P+J@f)JHrkd=$M)>-GyJygiR~INv$W z;L%-W8;Kf;0Y$++j1(sc6mVx3S9|A-Z8|5%-*2)@I^rm&7LDVE&qeXNvJkN4yoa;9 zMuWY%E&%UiacX(oh9$v9u8<{Tdyq^K(l?pWm;q`fSkWUkitH^-qR+HXAeVR{F4-(Y ze~C05$^r|o#SKuGrz;|=zd8MZ2RzGCje5H>&8mg^E4!JP zczL!rtHov@DxxihyX~BH|YSUVOSucXpCL5=K zXW1H>nVJfK@2P+m(=J00wjGvevaUZy`Ru%g&ZA(3$&aA?hWpW}<1g-N+Ax9gxIUOh zuk?0=0Ge@L5^T410F5rBBZ6mOuBvTSooH<_ z&5xRPO?h)qnI@t=gp=_B7B)lWKt{s;n6D~vCUOhhJenAaNve*H(*a0EVSyR3XZ~Pc zDbQS>xL?*(LMPD(f|GY{8(2IUGpOFT`bNA6-rQkJVEXf04=$f3k#p@b%9y5Ag&|ds zAWc$M9O4`2w zb=w?ynFj&>hh@~{fukhw6_e^&#!#>nq~GLE8QPS3o$>S}oNkT$pb?`F_it(4CKpyI zDqo5yrw*RcNf4<;m}Gm7Utzqiy$RqsL(Afu#oL$K#mj;#$(FwEjJfb!Rg*)P1xl!x z;v1|eww0^J3dVvhF}OU#+?skBvSg#BxL$^sUsf;bD{DCl*l@{ZJV@K~{9)aEmZ?4rDP6`Vn=AAMz-5L9RHx4Uw0^T6H zOyb_0wnkDefkaTxkUyYiI^+EX}4NsPZe z3!$3~CM5{RRa4oJ2x9#@1UiGm*=Gs@T)1(tJ)0qv@2|b$tXI|z4S)fmg<7?49mJWO z&DAecD)(!LN557m1qD}VkL)ynCHy?tl%BdF`^N6~{=B$E>DWtjuFK-;uX1qqJOG4L z0+HR%|20oeFx1miAf3bg+=CRV%Z>|2G9<4kHd{6LFr^EqZ^8|5xooi} zrIWy|_a{!}HzAjky(?kc3t%HI8{e6mlrn$XiG*NwI|j*HA^D!on`}?G0(^N8Fe;d* z6c*vS;@O}cWB{}9aEa*Joe+5RcD5)e>NBV17;=jzJ>h^oX)qXm-!mRmMd}{i!AR}x zWU_U)iePmSsXjUND?i9OO;L3~@`gjk0OUvGGG;j43Da#wrz0L8Ncn2%$w{u}yQ>_J|ynGJ0cy!wF7pj`;KTJd+@S1qgC`g9ZI z_R_pr}m~THn(Y3AV(KD9^Pytt@Ki%Jm_5+mP zlBn_aKC}Fx=c7Xq&{Y*uPmY}v!0))O%gp#R)z?R%hXWP^e!C`9iH~Z>irKi{muL|b z=|pWJp*))BFh^;jH;RIwqZ3${zD^m+I7`p}g|{f?KSSn8Dc3|aS7!h0ZStgW5d0`7 zm(l{%hlXFN=7D@i-FllMW>$cza#*RPl<%`g%*~5f%Q2Mg!J7RE=T#8OSJIy`9BnT8 zTqo7Ttd$#^y!FZFbI!V|8c-lInO6fg$sDg$s9y5Qu}JTyWKLNq(J6$(4@<{;o-^si zA5`w~d%@BdDRykHM1_KK|I4Eo&sDJ6sDAI1p;d$Ar38mh!YTCxK(8D5*IwExiGcNq zt67DgwVYTOzx62k$zs?nl{6D!PQUzNpu#h{2+}=!j>IK{q%Zc>z^Y&92;a6zEI95Q zN(x&KM(|J&sN!&1{%no0AyuwnwsK1V7NpaJ52sV7A9^8fZZsNN4#KIg8)`pY0?+yW zca4j}fH->^WF}?(_?zmKV5}Gm2=u4GwiHTYVN7{OcvUjwmenne-?K%b0<7eI#u|9w z<^Gz=z5tZrc+PbN)flJ}E}IWD5!Ciam*GI=VEfe5^uBFV@ye#`YJ)Jb?{n zPuv8M#_-Q<+mQ+L;I6|26T5DWr<1VfWcd$awSXivI+EPQnAc2wWq)K2hYldB!|CluY=V~}%lz&~`hHviwT3QPY_ z!|A&M-Gk40kZLpI$R(IMH&e$og%;kc&0V+dIA_g~g-$tl&C7zZI$y~ zfuB5PFQARTw6-YFjt{a5S?t{ zh{zDXPo0Utkg#l1Ny43!&Hsw9{JVcvsL5TAZ;GNF#%6%#|G9DpsTgD%dty%PfBi`R z8Sh~+WPlw8>EXb=X&S^pWs~lYZU!KUWng#u`hZ;fB-?mm*SnG20=wd4f5-E1;-p~uJt@`or`noRPCxg zt5z*>2!y1k_tsl)2}9?ipBI_q?t7ToCA%Ir^9rt~@-nOQaP%HWDC4uy&7|CF#dY@a zR))1$_rl`@_c7Y^li4vW>eT1@F~5WtnHSeBn~Q7UUS@97+@|b)@`~#yIaq7juFa!A znFiHLHZ5uf@$nwIgUhZpM$heSy4~%nv*6;oDdje}zmA9FVfzX7Q6FgxP2=5hU``id z{=7TcHJyxyGZsv@&I?wn_w;zo8?4pMW@wIw7hh~FBo6Pxu?Q`frs3pP zz?flCeGK~OdwX%RoN3cXo=B~HIUaBBcD>Zvtso*+>nyw#GJ5KMYw|RBl_Fw~`Vl_T z-7Vc*#?5R($3Zkf&tWf}4*RLOsF5D+PehNpH$XAD^xM~CI&ZXtmvu|9D?RBs{YwkO6+kO%k{e&8$;5eU* zd*`a4)BUdftb*TOXcJX5_>BD>)>lyM;?uJpA%&8=ZyfmMQu;cpSHSO${KIYn;vzQdOG<=m8=Z^PtG#pE^wYJ0ES#OUQe(#x0 zaPbOsJDu=(&CaiyXv^L4k)MO&g*?d~V79w?cD|5PZyx7u9k(YjOJ{Vm8oh4Qf#z&6 z-&Ns6jOW$U6@2DAn~VTT+NWE?;{;1V)=(RJQI51rWhbk>NUUOc-B}BC+0$zX2dmi!0#LUZMR-HbV zXG*u$fynb~^RZ{E!jNmzdil~KKx1D8_tJpn%v6WG@G94JK6Ztk)~gqHr|$L9qnt( zvuixE4vTkoyy5DzMWxkF@ZPr%zBWeXc(%Ow4t~9!ZPqO4F>riN@@?YHqrH3BJ=3!n ze~3%or*P`0)8J&4>+R!S@>BMl9*W5_M0{@F(z+=;jG?;$*ga&o8zWu-#5l+uCLHMcGBL6_7;6Mb)<}PZPTBy4d-Q6fBI&)#l6iL zHWTfvn=fMAUo{%9*bN7LFCT}?&1NL)jXWK3+Ygp`8s)5azUr4FZmt;hy}WYIdkcYqQ(qneMFr)=v#lTV$@;U`q!dpTpLCefzD&pp6xx=eOG{&-4d7IfZI1X<| z2kW;9ni+3{#Tts!5WCvBr!2VPj3)^SUrT zi^$`X*@;}w{ag0(gmt}1Xous$E^Su(@t*4acXh~?+S0eL5nEjEV7GH@n8V?&e68l} z?dit)(KCusUo)=782M8j;(3pb-ScsCzIrhgU7n76@BfbX-}tqq*Ib8aZlaV-!o%fkk>>tk}Btg1mRU zT!%(gjg2e6k&}sSRE76B*SAd|CbJ%$hkAYMzs%#52i_nSa2h`8D{{})-PC6rVWxmi zM|1fI&ieb&ubaWRXzY=H4DcNcf9k&n!fhf_Js-_#I4gs5pWT)ZPh0P;Yb##+WgxT@ zOKwXzO~AFWJ3-^&WeG;eMQN2S$VKELd=z_NS!`6Fp5Z-VL`V8|oR97N-3-$H%jhSX zw5_bK_xrn}#kdUw3gg1Q`P0P_=>nCm<%rD%m17=$Oi7xYjVOg<$@e)kY{}3E)pT*S zGnl!Xi_OzXi0X5>xuVm&vgFXQ&BLu|E&FuZ6}m-w!9gTDC*2j8raNPCNbmFW=CZl$ zE~6;V`xx)vqoJO83s$deORLLc@45A%+T7wcygv(k`&j27<9cw5cJ9izHr461(C*X7 zZQkq2p0hU8)2mY??xZf{3p+=5%SOXNa&YVnJHz{ZHN&UyZdCelOpfsE4IKYfnB?M= z+UT}=^3^#`OuT9%ZE!Tx`mC3ihrgQcy%FmTn%nGt+!*u6XfE30O3W8=QjU6`lVSv zC$mqrbSv7r?O>9%oBDm;#EsjVYO~ceX@d3X(7!IWV|s6P`s}Uq7qQOZCA-zQdIqIQ z>*=OACyBX{GFTn<&S5kt*wR_cLvEFZnr~B3V%+Dk9#jb-x zuo#@quPHmX0Xsj~DOh1=ke>%j45MZ(7jSq!o^|wk8T09?e^|moHs1NDvhIU_tL5I$ z9YvflG}-q2dN|u(t(pB?zTHv3SDt65;NrxkaoG?kZq+s_T(5L+T;8_9dE>8RGYFHj znZ%=`yImc!eKwhxgGT$TlJ(kN`^N5=?d$!1K5s{oESAgVj>NjI&vnN$wmp4bZ+5d; zJCgC?cwFwxWZs|azW+Y<+d(_hpQ}f58%)jUJRHvt@Ab_e8oabf5meg7ACe1srP?gH zEN`IHdpB)kwYz%tj*b^znEkQ}4AYI%iJQ1=wdeKfk(>q_<2-x&t{wq10?FiV71YMv z+Iw3|qmy8mUXx|Z20mIYm=_OH-a28}c$*_~+Hyd{OGrN#PCu)Zwc41tT)bR1T7LA2 zFj(PkU|h8{s4|b6dp(-Ie_le2`h6V?`G5Ui|K3yJe{3o6eE#kz@WZeyI-*1(5e?Xz zm8ja0K@KRpx$@If49OP0GeTUK6<6A!8x6; zuv)wyWZgarBD3c0-ki&bWdP(Rx@{8HYK1@QR`e?-s_s_!Q?;pq+ED>MK$GtE&#D~_ zX-Sy1BxIlSg@2f!N&irPU`GH1da2)Q;0^(5FeK0?*BBNYvr|3tfew6wCMM9t#MJg9 zmK@-A!sXaaAN2*c;|p+d>7VHZcDGY10IQt~2GTU)k*YUCuK`X2!Zi~({kRPquqL+9 zhmHIq(`fsja0-xxWb zAt4sVD9{XHHJFPP@-z!ceYqCq!QdH!C?%LzHd@Xi;N<7Hw6SxeAt%&=*sy|Z>`P)G zQ8Ns7?<2T_c}6c~?g0PmI6gbTGvAQ$#%kjc@YTi6=bSXS%|p)E zUE=)*b7I>e6>uDo3}oZUv2XGWN1WI$TzAIEXVH}`S*W{AWH<&P4e&-F=7HakegpAg z`GG+R!Fwn9ViCs0LU|MpEDeC_aS zPoH$)8`;qOqy-h3Wd?l3T4lf4(2rCf#hu+Esb1@z7WDM}Js@S@ag2nrVS4%hc%7P! z<4Bx6A|95(&r2>0Q;ZijN)3!E5AoQ8G$RI-47k_hGB%MA31fK6hfdJ#mbARxYv z<2eSlGQ>DD1*4XzO~h+FyC%t|&@M^qpfr+oBxq)94p|85E&_IO0yc?c$uKYUzF@@Q z0wY0j?>(9B&pzEY#9Fre!d5W%$Qavbjsv5@xF{p%6h{jV2H;13D%_shCWfom#9JKj zW1lD5#Igl3*r_&u`t|C_)cW>Wc5zPG#gBM5SO4@C`!fz|{^!|>73sIX+O%PL+M-7J z3N@G0mKE8@1fn@7cIxag&(?nX{XKlrD;3?nIy*HB_VJ~wvsPabLmL=8yJHeqR!$xP zBEHYZg$wD*53}J?(=oBDz>4G;Va9?JRmB(-fqKn7kvmyG84)$Sr#Cy0cOpuIaK3N@ z8e<@fI09rgCALp2!vXJenJqz7r5Yb-B*BrW?33>>Io{cgi9$=8dsbi&k^89_f1;Qd z#vmCZNKKPdjKt!)6ZL_dDfT{D<27lyj7rzQY-6F??3eRomGc+^+0Y_$pwR(1+Q2@8 z_fK3w4`u=<|I_~uZvO`#PrFJ>_|`3mHRVS?w$%q)VkHT~?}TW&IZ z`((J30S8CB2gJL*2h*FV19ct0uUimR|MNOHyRs%*5y))X9`{$cF|yrWNG#ouyOuit z_8wZdoOtRwOG!Sk<9H@i*x$CUEY)=)-%xKb&(=`D1G`k_~+ z$yVLplwF>((ckmfZ?j8htA)NLJayNQ8fF7a3#he*%ppPLAtTnzMjIfge||$SG$J5K zV04x?4#*ZuKJZbt_c{0AA|i_i=qSb!k&_#D*Jp(eWO2Hsmb4erVB%myXx=Nv1foMA^jOQ#EI(f zR^bpNvZ9-B*x#l(5lrYy;Pbz+fkJm4coi}^F*-c-U!`ip|7eu}!ywS;PC*H1RcZeA<9ZAruu8pW+2@j}HR zB(uT#s!dU|pY`vzIdI~8M&-kWTfW%MEA8yemkc2oBk0Bf?&|uIyJsbqLl1T^)Hui= zKPxiZ`KY;-eR0FrSATu7$VRM*b3f|*^~e|IF=(szG9bjtOVe9ti>L?=AO;Q&t4kO$ z@9MO@ERJhGs&|arbZIi3Bgm;3=*G!}qtF+;j2#CflR=G=a!$O64roz#{>gp!?~s-F zCZMP6VG*Xv9!6%a#v&c~IK4U_Ht-GhZPWL=E*_&#cJafs`<@kP+xd;3G5#O^qRmFs zq7&B2kNeTz!1cgIG2k! z8r2|x3OT0~fuPhVw400TE%|7|mJ~Zs-7%QRM{KnySW0tluvps0c{7foI;#qHm+$N| zTmtxjO2A&cG(?7=pbvh74)etHJZoe@`X{lp)|3AE|QR zfa5}Vy_NPkUbU8M$H@`a+(hSHi==L%E;l4VkNpQ^MBQJies@qe4@X_R#@U5_Xm>v| z;00B_C}fFgupi%)uK&VGYAz{^t}y0m)aC#svyEJYG-sw8mMA%n5kB$84=2ckeYnJN zy@}Hm1l+}(ucCId;A=evQF50H1Gojz;JHP)5Z*Z}OzqrQFrlX4h~~gi$eV6|w+^@1 z4%}mKB{EdrvIxflRNf-V$86%5ewca|3pLzEMfUOA&bEIsb7w1GY@>Wm_c!>^pXdLN zUuc!>Wfuswq0b5OTGmUX)?o`I$S~yTg24DeTRNg~+$>xAVwZhNgN%Wwi6N_-ALy|o zgpZ|sSOMi0xM%W-OVjcb5ZnhIBPNu1L=3}WUIt-xc29@n#_mn181=@IU~Ka7svxBS z6yt)HVVM<7?I4IB{W-TCxB(CeRxL{e9X5`0lV=tvKNqsW4;~x(GP}b@cdHMvQ^~38 z=q8r#1&Z4$k|WxG*He$z>oDxUYnl2Wh_aT4^0Oc1XE6g$zzpC%@>{q$D8|sL`|;tw z=Az76Gyk!fKlxtU&D*Q$ce9`hPj};F27KN5sXUIq{T^%n2t~`Gh%oRd;Td8jap2lS z@l|3RlMjg4V8uPy7}eM}*z^_XAJ*<89QZFd2F^ClCRUy?v#d&le8&@2vbqM^Dvw>S zEF<6)nX%UM3!*KeQe#_s45Qo4l&;DDV`m;9{9|X{Pd=`m^^dRl%|Do$4+^t>pL6K9 z@t?o_%2YjTXJ`Iz{Mjy;kvx72-6fVQk<5?I9$51mzsW zQ{w^OFXHrS<7&-Y=A=+w7EoEhvt`tBK{eiqa8?Q%coMzUo{*3!|Mm4PMQ3lV$^VM` z$?cTBrjtrpfqt)RWce3M#<`Qnn*SjOXcRX=E(;jrBi9%G+Uv<2I9w${ zk{L#SXc*u8pBhk8;H!xtV}v-f5lE`IArPQgFjOgcg&8>NzF}MvnSSq!)9X)Ov^MiU z^Wi`9u>Fl`-Sfvyjht5MEli5U&h)as1?V@7AAQLAWCji;J<;^FzGZQkj|lkue)G zyR&=Q;clD?cc`q;vbL5j=TuBr5 z#a*KxT)aJP=sGj#27iJ#3iq`QabPCp#5}opEBA}AJV%x$j|QQ8=R-dXKkejPuNmPK zPBer^iV#X%=aZ%u$qM}0C#FI^r@Dt_jDR~&;I;ss1+0lyt%{)T)}?Q_1i0*sTAFF_EzZ4F8KdmW>@PW6Af zPLK#|e0K$M`m+r@d=7_z_3Liu<5|BS<3uXID%ANgR{X~&{`hTN_z??!d8nUU?(3Jj zxu;_6cl;HO$g>rsLh|b_!h?C~h4bsF)tjhv%vH%60)(LWb~5BX-Jb`JU2=ZX+Fnn_ zwGs66<2pEoVVPS&M%IED$QUDhYh*g1scIUSYDk^u4_|N9l7PZp-?{+_SVIc+|KuW2 zFwCp|qr}hmYy;tO9tzXwKQz@}>n?wmitqVX{v5EzTyMc0_Tx(RONYO5#S5YMn?HX0 zMcs!hU-OgisC-iU!LG<2#t5A!UKo!)M;}y&0W|qc}KI5Sw*z zo`4!esA}c+5;eb6Me4^+6H}7*$G5FWlNFv+I6Fx8gLGdy!llvZS+~w|2 z*~@xd=0QM1cRAgecPxzozmK`Z>LkNZ z^9jfQ>9_0vc@~;YHYDvBclmY50%-UGWM3a9K!l2b&u7@ni~zHCVEg#>{|T9DzW*QOGu z?}1CD1+W%#{2uOAobvnqyHccoBxDMiVK07AuA?t5`^kI$_Wgf&-Cr&@MV)W?#_r#^ z-sL|p9|x$6`5LYZ!Ff3xbJB30lB}>Ix*!9J&S$j>v~-cVxvmGCnt4p)6~#B4VO-8( zJt}i+y?qc)v7u#!XP)1Fk=y&_?6SF4AxPp@)~&fCiXpeEF3CZT)|6r>wCuPAmo{@jWvlX2#jb!sieDVtAZJSJEJ1*zTSnO*PNJ^Craq92OIy5zB zkGa>Ii7poPWO5HCL{A(_dDByuIVSe{`#mtv8MRN zf&fQAxWDUPZc}8I)AEZSF~xKL6KhYu`N2ONxQbPhrVx<{UYCUjGIy>hqfPlSaz9+e z4zYp&WjLE6m?P5YZf>6M6azvcT_R(0OGN6kB;NX~Ai#ONLYxu^8460>WicoCEdCi6 zOs^nrOK#35G&sNGKx{E8u@I#8cx(}#@Z+#o89+v^i3YpLn5%sFuW`GnakB(eYTWEb z`_H)j@VJWC=;B^x(^IB7pR6FNzVTr{_#+#B$MChpQC9iIAmUtlhQZ=>!8J(o_1U9- zJaED_I>$s%Oq4I>#4*t=VaD@lK^mK8TwEnVu(@ygb&YpG(M%A_Bur^w+-{!YR^@w| zs)sBUKig)Tj-PFRa70%F`r4H99os*1r{l0qNbTB9dK=N}?#2S~%|Hy_I1F)jKAuOI*NzPI0h(*IpB;?#R z^g?mOhLq{5mBP}@g(EAJD*pBZnRm)8BE}{|88sSU)-au~);ci^Vk&>{bpD>>8q~*a ziv;=d^C3y-CktppYzG{1yiTg4a71hZ>Th(M@-MHHDF1U7Dqa-od>ekwSMehM3x}!y z)OV=E$H}iR>iT7~-U3ma(VZ91$N-KYQTZ-eBu4pU@m#lsPJ!EazFZG+45b&BV-n8z z{K(72Z5)6ky)=)*xX=%-?08Z2(g0j^ar28Oe(EV2Ynk%BE7tOnpEH&FBuG#jec06z zbm13iTFWs4u9XFnZ%=xC#QhrNx(^SIm&b7(N@jX%hIU$w;XM!-Di?z*zAIgnWMPr3 zdB6ay`on&B8Q!vHjLn87X8ZLIq|I8hp=+~MpVKaevpkMLvcmbsD;o)BQ^~MV&=&G^ zk1l|Ki_HdYa(kUQz^QZK=>mbDZY! zWG^^n?YH)vwO?PCwq{pz%C0`7Hj)#>V+S4bagTyIjm{au_h$p#|M-TEPU(5Fxnx7{ z;$*8qlU3n9a)t9caO%$mHLCcQ!tO9EZxlsZ7=HU(IcRsS`rGd6E7?zf|Fp%(e(<8o zRmTL$&aS)KI5Om%ZHeMCJZGpq@v1~dQ|BJqx|_5gI#5FnCssJ8j{j4-j$v6k9xuTF&WQclfGyLf7p7;BP8pva4w9holv;kI zazOT7DYon_;JEA$g+epG&y#fhcl19IkzIc7y!%7gWT*vrfKe&jGw{Utf5AO*;qxEf z`nO)F_zsoZrhj-}Th$hvB92V-$6v(*+S%`B$K&jTiVefu+~RhUm_po`P_=`6NF*`c zX5evPHV9RBW^Z<)r7vm|x4PyaiS8$gu%?ai=AJr=gB4H88X#^^olsC_C?vJZsjBye zIsa$WrC~ig(IPsr_B=`Y+DAIG^lm2LW6C@{_-K z?{J9*^~S_iE?F>3hbud(Q2Kc{>?EkO7v*xlECCRF03$ zoMI!Px*v}@4pV9daclxrTx$+|P)9P|S~3s6^#{8@7uH1i856$vhUUWVcwza?`~I=D z>@V(2`9)SxH7>tAcbBiB_29P0#bjafv*`qy&Vo9NN@f{3%}prFMGj#q(})OhwPcDe zKo0%5s?kTsMAN4iJ57!7>>Fb2JHfd0$8-&xdJdFd9&4%QiH=&XywX_BlZyl2{J`P= z)pex*)O$kmcP(V3FdKZw$m-@r9-|Ang_hjA8?IpxO&Rjck6U=6#1J$w=cyI& zvGh1|pb&fffjjWQGYTLk4O(PSqGfceh~!&4AwGnf5s26VPM%B>Z_)4$r&wwZBpvT_ zRDOZT&MzRAXGxd)|J1Kg9w)4c3zhfLwyUdtpGy!+Z75Fzjk=9+K*V@^*>AbV5E_sv z;vT{SN(_{Fh*z<1%$M=4?(6<#jVQ7dbyJr&M85%sQSO{-PNkSyKj5>7ssiZa>4%3?QKX~8G8a^ zOkk)d|I-dLbTTpzMBB z!NtRZEC$*>rk|W|a228Oy9ht*>peIy)gOtfdv*1YhWrO_{iP8&v0vQrPyXDs(Y}>= zVe(SrW@4b+rwcCB{4}Uh1}L0EP^7IRN^~}uDk&_JiY_6ntSLA>b2(f1K)l3|y*2Jc zZ(Uqos<@nW`l_;v%SbRR6z`B}zuK2Z>1V$&8h!EL`L}MM{O=cYIEDU64@}&e5u%^mm@b znd-l<4od#y1zj${Ivz{ucNK2GYfgk@HBO+yklYeT6C8_x`20NHOB;8#$-j281)C|o zFnX|c$AdP?9=MG@f7wI+S6um12WhgOarqNRvVZE-#iAFNrH!=4U_!HOUNsD5BO>#4 zR5lI~x*Nn<-;iu;M4*`liH%qV8-ZG+BNu09OGsvO-Nd3~cEnev7EmgL5kq=&L`iL~ zyO`Imd6FC3IIG;M^Cv{%`dGsY35PDu^KRaqyJu1u>Q6gWo}&EnS2y#0zJd)Qsv>Gs zGXuuVk%B}Cit|e8cElQS?U9xlHuBiEO1?T>bLTjkJNs+qc~Ii6Uc-^2`t>C(UEyr> zV9{SX%=K5N)Ya?<|HXTu;w*Cg6g9O8$zY4L;6)L=C{D%ju&hzc7F?F8~k5IX4m+y5vNYdrTE&JL@^ph*M%rYb`9I0YO_T?=V zKO!eP7;p+aVa7QQL&z|2v0UU%YM&B=waiFFj3A8f2C%oMG4zHQZ4h4sEADU3a;B)8(3L#l5Py z)@j|p?Hs;l$$4qW9W|SBJ{EL#sc_!aH`ot{6L)+L%VWFalYV_+dhPh$Ap1v8 zUgz1GlQ)AwjRc_^DV|IpG%%7ZR&|z6xL}29{EaT(ul}VILh_FeFdd;!g*KPT#e`;d z=uh1}H8of}E=zlsl>>^R#r7tCbd8Ll3QQYNr&m@yuo|D?Zw}G<(@xv*J4X~wH$y*y zR@ByspNQnP#eD{C_OL$j?{RAcw$+pbLXF|}pU<7Yw=x_Ei~Zm&Tlss$`QLb})4Ohl zPM!+KQks-*osCJbAxT%aBR@FJ3StK0tLyn$@A4;yR{G*jH)^)Lpm`j#GjkW8__~A| zgQ(_CD5hAr<=0EjAcO@*nUvhwB z-|V+cz2aN{sUI$Jrw{FHQE?%`|G=hER@k33b$Ee^%2iWjRo z-G1k%Xy>OSQM#D;%Pq01;$48py)~zyBj%=aiYdkfZ%m3Ih@T`O2+O+u)(x4m(^~bT zq4-QGzWw;=`te&cQC#ae#_MS8Q!c0zZcO8ohKiq#b6R)NCLm8!&3{s&K3Ml3-a^fP z(p^vK@YMY5)^q*ZyP7{M&EzA{%> zPyflE{_3xYCCN}=ZsnE2kt0c$u1-_KO%DZto|I1(fnfL!+ z`YSk9TF}%R1mtNz{nuyZuVOVXM5h<%>guO~A#3vEuX@no(^z4^b}8sjJtDO?oN-g= zZ%_CH&Xqw>y7WF{BLIpGS-tp2A~X>;K1~b{h<#Bnlm6-okS>)DBmG}=80H!_pY27s zZ4CDO+Tmx#U9(l!KCUDHrvVX~^`m!;Si?fI;lhtn)N$rAHBghaKF;uGGOw>wK>dIt zSW}ER!G<1t;{!QdxtT%o=-uAaOSguOI~K};;G*cQ@(e*cMv2NBjiNu5Ua0DCmISGc z9zU`V3$wim-1u29GWz8>oAkGi`Zq5K;lDK?f7k6GigPnMwE{#CM)P2!Y8_&Z?R;ad zK<;hP46Z^)u#()u`eUixniUrt_p`ARgG~FiL>pb zQu=hzY(}W@+mt|XV3^aLd#SJ&s`U}(wtwICZh|5#5*xPj085^xw@2?S1n%D9-Hop! z6>|B;%UboXgCQos!T7CDs6OIEt@C(8(e@BndjF{7Ksf2jEPCVfe%-G(X{QnS(fjPU zva{?zcJ`xx5p=y>PABkK&Li$z`-cZ%6-?2v$H)@rkjMY|iy3N0nW1syD7AfAchzI}b6eLzs6{GXA1-+x|9RiU%$ zrgWA6gE0L|_pUTX-FnI{m;dTDe|6*QudblO2MLwV08ZjyHcZDNs8H^#DS{mgG;>WD zH%eZbsupo_dMGxJDA6!$#!rksi1u3d^RDX?=iF2=phRmB1J^BUM7-2aGzHPww~lnH zl%4DVm+IJke#TEX&{8az(*IoktfOULpZ!Pk*UgP?EkVQw%5Q$Ti9dOu(#L1P-#Q71 z_See><%Tp*@L~Hys3&H0dBc!mk~gW+ZjeNB+vX19ye3+;gp;VYvWHUhg9xWXe^pyJ z%yV~8-4D&=;TLOJN$r#fQDZYL5l;~p4D}zChjHR#v;p@ce(gb1_F#1R*8VSj)6W`^ zE+=W#dP2qRcKoSGZBQD5kPUt`*4-K~s`B~vca7|i-XKGXMJp0!97}Q}h#QuyHIT%D zT#G;y3vAIva;X@I3>$%tksyX|#D)#E!U!gg%GXQUv%ZJ}<3svx++&oF)fz*(EFL}m zlcJp^F|iwAtYeRHq5fvOcvJFR8%I*_;-p#-2KN}ZovwV_nv(wT0O?=rbJ8E1>}pZn zGb?QV&zPlu*AjllwbRIbIz0*gvmP$if?&AcI(`-aA@n3`EXEj1`ZN<;N0@W`(LKXP zo5a!-3F>*W<_<)99K=r$+5(>%1Irj&@!+!7HXDOy&s98GTA^B>Xs(RX+&Cz|dboPT zmcI!^x^O>Ly=g?bipe5T_%URgXp|$X;g>%1wTdLI;&YxoEy?C+8<9M3SI*zT^a_ovyD` z*U|sc^~Jw+(SPgHX+RCSG$dKVIrxt*9lv0oA+6K(Nwu_=J_EtAWIuJf^sAR{_;+0Y z+s5hGp-}#|Q3`Rw2I=l)3@KiqBsQa;HT}UqpT9iV|6lhJ_;UDsE@!9crM@$K?*BwnLsL(EB}4uu$0UNLm*S24a6E?NmgoJ z&f$B$BW(@LPF;Uj$F90QlIl4BJ;vSdAK&Be`Q7zo1q-lKFfx3RFos(VHn=-5D}0nN zgC~U*I0=|3UMO60t6?EM0%oetU&CI2tLCFAu&s`VHLOAXUEndm2(CJ;)XF9!!@1IH zpCowT-T*6I6k4n68A5GtGFJCrsAB|90Y-)>M+XSirECp|-mM;hgIbSDO(3=6i%uY7 zpj_qO5-}Cej~r}Je=lLC*0J$-zv1>xCCxL5Txco?dG~j9y-b}SN@@ZoC=tkowGK9z zH$Vz+BL^}K4Bz zBg2~7-{Pnm*)>Xy&-QCiwg&F_$1;_Dd#}DsVI`K8vfqJRUVrTVKmX7SfTFXs_}34) zEazx5w$T3h(nJ@v4-N;V=Fkkf)W^!sX2O`NwiSc1 zp>FzJr{B#a^m{R-_UanJzWgQXz^D9f&I29Tu~bMiG+0S=1iONxz(Rr2S{3Ibf_>@P zP}g`Uygf{~ae>7SCS#+5MFG>)xQ7r^R0{jp@BiF?4u%eEj&iWaP${tQ0la`TP-M6f zo&!&TN3e)sB8-b%9AFAYB^PIy3PC=QQq=bQ{eIE!dHwORFZ%O-f3)n)`m?D2IQB06 z&#dPjhr9mfF)!Xjzwa0N;Mhie-`2HdyXdo#-Y!rvwhXcUi3|U~`G+N7DQZB;iXpOzenE$HM?*`3d67U^5qRBt2O}l) zSp%tSjKt{{7)oF82jrVT<~2A5pV5WMO>AQnB%zehz_+GiVoTF!gw5dFNK!ePb#*?3y)sh4$K{K1GJnytnN9n) z1KYQqMw>o!$$3yho7tF_4nuk>CWijfV>*yXDnP$9*r*UtI`X|HnSj(zU}r-T0Jp6+ zz%AdlQUWw{pVf&bzU{?kE*BbrkOZ2E8aQpzmG8Ap=ye;g=g7B>4e)drd2J*K_Qqeb zY@2xk?j&(;F#)p;eY2QA#=3m9(TC1Vps3AqDy55t59SGk(=VB_%0V~Rr^C&P*%;=+ zjd-74c3>i`vUx1W_sjuGGim~)>puyWYDon^g5}F@s%QjsczvN& z1)@@+8)I+9Pd^DZBnu7*Qt_p$URg)lZUTHAa`vx&ex|8t48ZBUS$)dsyEgk{U(9j* zgD-58#L&E?0$MqY4RFRrGhQKaz9OMq5nXQ#Kehk_5^R@zC3@M+%Z4t!@@4BMfR$~% zw0`pd|7)5mXf8V7OXp7+UG^)XJZGtZ4jFV~tIPjEZH}7G0>D}x9ZJ?zOI|ZbHoCFL zv4cY9C&4N$2Hm*Je|%6#DtMak@U@w%EWvU#(KKt1mmLC63J_t ziPnF?&1o`$Z6aPcS(0sDdUchJv*&06G<*4oIdV@>dCX)1Ms}4ASm9+4tnAU@WOBen znM;05_4yQ4rI!;82I=w%pZl|JUG__}q56wP<^BBcbsG!o;?;i(Wj4_L-F74u7+=2w zbamO`r5jVAqpuyJ%ys|XkzjiRuCW33eq8H$zwFmj!3CFjkFPea(iw^KH@3Qb3a&37 zGAp{6_aX!)u&ybo!-CjTva*g2To0s*?i&3vDJU--`MDm zRz1F`CFZ^X?>dLcUw%8Oj8;rE{fA%rAve1|qZR51=+wH#m}Z_Bc#;lg;{^FD(}{_S z%U+}dEEC`l;owT&MmLGszyzpqG67?GRyfg8ZB{ft0sNAOE|GuzI;4GODsq)t8oi?0^AR|0-4GXo;ETiP5IXl!~i=GIQ+U_`+LN<+vaCC13Xk zejGbpec>Nf<-{NOCEwx;SE^%Y>@R##89+^dFVqCADnl0&T^15|#U{Qm$#3l4fX{4d z^|@l{rmA37NU&bxm-ZdM(&As+8K^_2sK2qCp+)J6v5j7TeX?S{zC3Ys;ro}a^g=>8 zTsXe^IsRgUJ6lBjWmo(Nc4g#vV0paH(vfh;7w)M7W@C@#KZ_5m3_yPM8@ZnI2fpS1 z2mK%ct&snspFeQGkLItJV-u3jYS#hhDHS(QY&c2mR#?Zs?*BD*gibL}Y&xlBN~sCJ zFCATS{+Dq=1;9jw4Y+!3Fz9AnHdFv#w!tEC`3Ao6P-^XPP^?22ukqR!q~se%ZJn9w zf(DlBUV1gEV*_-&@!xoBUNN!#X(Q|`pqUBGtb+QAT4{yE9?JK5$KTsX3?WKzT3>Su z`WidT4VWWP&0{Ji;hJMyag`6J%`9jeB-3VgwADvu^NpLzH#Wm*Z5?_k!BH`R=!)O} zWMjn@oBx={(41aGjIq(KUPhOEfyIW_a@C7(OiKXs53(<%{|(O;5c=s+!9Q1jzW(x+&Ht)Dm#rQ5O}oZ;&i#?$kN