// Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "paddle/phi/kernels/llm_int8_linear_kernel.h" #include "paddle/common/enforce.h" #include "paddle/phi/backends/gpu/gpu_context.h" #include "paddle/phi/common/amp_type_traits.h" #include "paddle/phi/core/kernel_registry.h" #include "paddle/phi/kernels/elementwise_add_kernel.h" #include "paddle/phi/kernels/funcs/broadcast_function.h" #include "paddle/phi/kernels/funcs/elementwise_functor.h" #if defined(PADDLE_WITH_CUDA) #include "paddle/phi/kernels/impl/llm_int8_matmul_kernel_impl.h" #endif namespace phi { template void llm_int8_compute(const Context& dev_ctx, const DenseTensor& x, const DenseTensor& weight, const optional& bias, const DenseTensor& weight_scale, const float threshold, DenseTensor* out) { #if defined(PADDLE_WITH_CUDA) DenseTensor cublaslt_workspace; cublaslt_workspace.Resize({3000000}); dev_ctx.template Alloc(&cublaslt_workspace); const auto x_dims = x.dims(); const auto w_dims = weight.dims(); const int64_t k_64 = w_dims[1]; const int64_t n_64 = w_dims[0]; PADDLE_ENFORCE_LE_INT_MAX(k_64, "k"); PADDLE_ENFORCE_LE_INT_MAX(n_64, "n"); const int64_t m_64 = x.numel() / k_64; PADDLE_ENFORCE_LE_INT_MAX(m_64, "m"); const int k = static_cast(k_64); const int n = static_cast(n_64); const int m = static_cast(m_64); // mk * transpose(nk) = mn llm_int8::LLMGemm(dev_ctx, &weight, &x, &weight_scale, threshold, out, &cublaslt_workspace, "llm_int8_mat_mul", m, k, n); if (bias) { AddKernel(dev_ctx, *out, bias.get(), out); } #else PADDLE_THROW(common::errors::Unimplemented( "llm_int8_linear op needs paddle with cuda and cuda version >= 11.2")); #endif } template void LLMInt8LinearKernel(const Context& dev_ctx, const DenseTensor& x, const DenseTensor& weight, const optional& bias, const DenseTensor& weight_scale, const float threshold, DenseTensor* out) { dev_ctx.template Alloc(out); llm_int8_compute( dev_ctx, x, weight, bias, weight_scale, threshold, out); } } // namespace phi PD_REGISTER_KERNEL(llm_int8_linear, GPU, ALL_LAYOUT, phi::LLMInt8LinearKernel, phi::float16, phi::bfloat16) {}