From 8756e304f8bedf2e43eb2c3d8bdee495537d0178 Mon Sep 17 00:00:00 2001 From: Sehoon Kim Date: Wed, 14 Jun 2023 15:09:09 -0700 Subject: [PATCH] Initial commit --- LICENSE | 21 ++ README.md | 110 +++++++ figs/thumbnail.png | Bin 0 -> 172848 bytes llama.py | 273 ++++++++++++++++++ pyproject.toml | 24 ++ squeezellm/.DS_Store | Bin 0 -> 6148 bytes squeezellm/datautils.py | 172 +++++++++++ squeezellm/modelutils.py | 13 + squeezellm/quant.py | 73 +++++ squeezellm/quant_cuda.cpp | 56 ++++ squeezellm/quant_cuda_kernel.cu | 491 ++++++++++++++++++++++++++++++++ squeezellm/setup_cuda.py | 10 + 12 files changed, 1243 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 figs/thumbnail.png create mode 100644 llama.py create mode 100644 pyproject.toml create mode 100644 squeezellm/.DS_Store create mode 100644 squeezellm/datautils.py create mode 100644 squeezellm/modelutils.py create mode 100644 squeezellm/quant.py create mode 100644 squeezellm/quant_cuda.cpp create mode 100644 squeezellm/quant_cuda_kernel.cu create mode 100644 squeezellm/setup_cuda.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3f0a1a5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 SqueezeAILab + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..68e3a55 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# SqueezeLLM: Dense-and-Sparse Quantization [[Paper](https://arxiv.org/abs/2306.07629)] + +![Thumbnail](figs/thumbnail.png) + + +SqueezeLLM is a post-training quantization framework that incorporates a new method called Dense-and-Sparse Quantization to enable efficient LLM serving. + +TLDR: +Deploying LLMs is difficult due to their large memory size. This can be addressed with reduced precision quantization. But a naive method hurts performance. We address this with a new Dense-and-Sparse Quantization method. +Dense-and-Sparse splits weight matrices into two components: A dense component that can be heavily quantized without affecting model performance, as well as a sparse part that preserves sensitive and outlier parts of the weight matrices +With this approach, we are able to serve larger models with smaller memory footprint, the same latency, and **yet higher accuracy and quality**. +For instance, the Squeeze variant of the Vicuna models can be served within 6 GB of memory and reach 2% higher MMLU than the baseline model in FP16 with an even 2x larger memory footprint. +For more details please check out our [paper](https://arxiv.org/abs/2306.07629). + + +--- +## Installation + +1. Create a conda environment +``` +conda create --name sqllm python=3.9 -y +conda activate sqllm +``` + +2. Clone and install the dependencies +``` +git clone https://github.com/SqueezeAILab/SqueezeLLM +cd SqueezeLLM +pip install -e . +cd squeezellm +python setup_cuda.py install +``` + +--- + +## Supported Models + +Currently, we support [LLaMA](https://arxiv.org/abs/2302.13971) 7B, 13B, and 30B, as well as the instruction-tuned [Vicuna](https://lmsys.org/blog/2023-03-30-vicuna/) 7B and 13B. +For each model, we support 3-bit and 4-bit quantized models, with sparse levels of 0% (dense-only), 0.05%, and 0.45%. +See our [Paper](https://arxiv.org/abs/2306.07629) for more detailed information on these configurations. +Below are the links to download the models. + +### LLaMA + +| Model | Bitwidth | Dense-only (0%) | +| -------- | -------- | -------- | +| LLaMA-7B | 3 | [sq-llama-7b-w3-s0](https://huggingface.co/squeeze-ai-lab/sq-llama-7b-w3-s0/blob/main/sq-llama-7b-w3-s0.pt) | +| LLaMA-7B | 4 | [sq-llama-7b-w4-s0](https://huggingface.co/squeeze-ai-lab/sq-llama-7b-w4-s0/blob/main/sq-llama-7b-w4-s0.pt) | +| LLaMA-13B | 3 | [sq-llama-13b-w3-s0](https://huggingface.co/squeeze-ai-lab/sq-llama-13b-w3-s0/blob/main/sq-llama-13b-w3-s0.pt) | +| LLaMA-13B | 4 | [sq-llama-13b-w4-s0](https://huggingface.co/squeeze-ai-lab/sq-llama-13b-w4-s0/blob/main/sq-llama-13b-w4-s0.pt) | +| LLaMA-30B | 3 | sq-llama-30b-w3-s0 (coming soon) | +| LLaMA-30B | 4 | sq-llama-30b-w4-s0 (coming soon) | + +### Vicuna + +| Model | Bitwidth | Dense-only (0%) | +| -------- | -------- | -------- | +| Vicuna-7B | 3 | sq-vicuna-7b-w3-s0 (coming soon) | +| Vicuna-7B | 4 | sq-vicuna-7b-w4-s0 (coming soon) | +| Vicuna-13B | 3 | sq-vicuna-13b-w3-s0 (coming soon) | +| Vicuna-13B | 4 | sq-vicuna-13b-w4-s0 (coming soon) | + +**NOTE:** Sparsity levels with 0.05% and 0.45% are coming soon! + +The LLaMA model [license](https://github.com/facebookresearch/llama/blob/main/LICENSE) is currently only available for research purposes. We direct everyone to carefully review the license before using the quantized models. +Similar to other works on LLaMA, we only release the quantized portions of the model in [Huggingface Model Hub](https://huggingface.co/squeeze-ai-lab). +To successfully run our code, you need to first obtain the original, pre-trained LLaMA model in the Huggingface-compatible format locally and provide the path in the commands below. +We have scripts that will substitute the necessary components, but you will need the original model for those scripts to run. + + +### Benchmarking + +The following code will run and benchmark the 3-bit quantized LLaMA-7B model on the C4 dataset. The `--torch_profile` argument can be passed when running benchmarking to replicate the runtime results from the paper. +Download the quantized model (e.g. `sq-llama-7b-w3-s0.pt`) locally from the link above. +You can follow the same procedure for other quantized models. + +``` +CUDA_VISIBLE_DEVICES=0 python llama.py c4 --wbits 4 --load sq-llama-7b-w3-o0.pt --benchmark 128 --check +``` + +### Perplexity Evaluation + +The following code will evaluate perplexity using the 3-bit quantized LLaMA-7B model on the C4 dataset, following the same evaluation methodology of [GPTQ](https://github.com/IST-DASLab/gptq) and [GPTQ-For-LLaMA](https://github.com/qwopqwop200/GPTQ-for-LLaMa/). +Download the quantized model (e.g. `sq-llama-7b-w3-s0.pt`) locally from the link above. +You can follow the same procedure for other quantized models. +``` +CUDA_VISIBLE_DEVICES=0 python llama.py c4 --wbits 4 --load sq-llama-7b-w3-o0.pt --eval +``` + +The code was tested on A5000 and A6000 GPUs with Cuda 11.3 and CUDNN 8.2. + +--- +## Acknowledgement + +This code reuses components from several libraries including [GPTQ](https://github.com/IST-DASLab/gptq) as well as [GPTQ-For-LLaMA](https://github.com/qwopqwop200/GPTQ-for-LLaMa/). + +--- + +## Citation + +SqueezeLLM has been developed as part of the following paper. We appreciate it if you would please cite the following paper if you found the library useful for your work: + +``` +@article{kim2023squeezellm, + title={SqueezeLLM: Dense-and-Sparse Quantization}, + author={Kim, Sehoon and Hooper, Coleman and Gholami, Amir and Dong, Zhen and Li, Xiuyu and Shen, Sheng and Mahoney, Michael and Keutzer, Kurt}, + journal={arXiv}, + year={2023} +} +``` diff --git a/figs/thumbnail.png b/figs/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e46e73a9291f4b448fb5586076653764f0ef20 GIT binary patch literal 172848 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 h>re>^9e(+L|2M2yvhUB~=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "squeezellm" +version = "0.1.0" +description = "Ultra Low-Precision LLM Quantization." +readme = "README.md" +requires-python = ">=3.9" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", +] +dependencies = [ + "accelerate", + "sentencepiece", + "tokenizers>=0.12.1", + "torch", + "transformers>=4.28.0", + "datasets" +] + +[tool.setuptools.packages.find] diff --git a/squeezellm/.DS_Store b/squeezellm/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= seqlen: + break + i = random.randint(0, trainenc.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + inp = trainenc.input_ids[:, i:j] + tar = inp.clone() + tar[:, :-1] = -100 + trainloader.append((inp, tar)) + + import random + random.seed(0) + valenc = [] + for _ in range(256): + while True: + i = random.randint(0, len(valdata) - 1) + tmp = tokenizer(valdata[i]['text'], return_tensors='pt') + if tmp.input_ids.shape[1] >= seqlen: + break + i = random.randint(0, tmp.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + valenc.append(tmp.input_ids[:, i:j]) + valenc = torch.hstack(valenc) + class TokenizerWrapper: + def __init__(self, input_ids): + self.input_ids = input_ids + valenc = TokenizerWrapper(valenc) + + return trainloader, valenc + +def get_ptb_new(nsamples, seed, seqlen, model): + from datasets import load_dataset + traindata = load_dataset('ptb_text_only', 'penn_treebank', split='train') + testdata = load_dataset('ptb_text_only', 'penn_treebank', split='test') + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) + trainenc = tokenizer(" ".join(traindata['sentence']), return_tensors='pt') + testenc = tokenizer(" ".join(testdata['sentence']), return_tensors='pt') + + import random + random.seed(seed) + trainloader = [] + for _ in range(nsamples): + i = random.randint(0, trainenc.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + inp = trainenc.input_ids[:, i:j] + tar = inp.clone() + tar[:, :-1] = -100 + trainloader.append((inp, tar)) + return trainloader, testenc + +def get_c4_new(nsamples, seed, seqlen, model): + from datasets import load_dataset + traindata = load_dataset( + 'allenai/c4', 'allenai--c4', data_files={'train': 'en/c4-train.00000-of-01024.json.gz'}, split='train' + ) + valdata = load_dataset( + 'allenai/c4', 'allenai--c4', data_files={'validation': 'en/c4-validation.00000-of-00008.json.gz'}, split='validation' + ) + + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) + + import random + random.seed(seed) + trainloader = [] + for _ in range(nsamples): + while True: + i = random.randint(0, len(traindata) - 1) + trainenc = tokenizer(traindata[i]['text'], return_tensors='pt') + if trainenc.input_ids.shape[1] >= seqlen: + break + i = random.randint(0, trainenc.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + inp = trainenc.input_ids[:, i:j] + tar = inp.clone() + tar[:, :-1] = -100 + trainloader.append((inp, tar)) + + valenc = tokenizer(' '.join(valdata[:1100]['text']), return_tensors='pt') + valenc = valenc.input_ids[:, :(256 * seqlen)] + + class TokenizerWrapper: + def __init__(self, input_ids): + self.input_ids = input_ids + valenc = TokenizerWrapper(valenc) + + return trainloader, valenc + +def get_loaders( + name, nsamples=128, seed=0, seqlen=2048, model='' +): + if 'wikitext2' in name: + return get_wikitext2(nsamples, seed, seqlen, model) + if 'ptb' in name: + if 'new' in name: + return get_ptb_new(nsamples, seed, seqlen, model) + return get_ptb(nsamples, seed, seqlen, model) + if 'c4' in name: + if 'new' in name: + return get_c4_new(nsamples, seed, seqlen, model) + return get_c4(nsamples, seed, seqlen, model) diff --git a/squeezellm/modelutils.py b/squeezellm/modelutils.py new file mode 100644 index 0000000..108f3d8 --- /dev/null +++ b/squeezellm/modelutils.py @@ -0,0 +1,13 @@ +import torch +import torch.nn as nn + +#function to find layers in the network (either for packing or for replacement) +def find_layers(module, layers=[nn.Conv2d, nn.Linear], name=''): + if type(module) in layers: + return {name: module} + res = {} + for name1, child in module.named_children(): + res.update(find_layers( + child, layers=layers, name=name + '.' + name1 if name != '' else name1 + )) + return res diff --git a/squeezellm/quant.py b/squeezellm/quant.py new file mode 100644 index 0000000..f720c1b --- /dev/null +++ b/squeezellm/quant.py @@ -0,0 +1,73 @@ +import numpy as np +import torch +import torch.nn as nn +import math +import quant_cuda + +# drop-in layer replacement class +class QuantLinearLUT(nn.Module): + def __init__(self, bits, infeatures, outfeatures, bias): + super().__init__() + if bits not in [3,4]: + raise NotImplementedError("Only 3 and 4 bits is supported.") + self.infeatures = infeatures + self.outfeatures = outfeatures + self.bits = bits + + self.register_buffer('qweight', torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32)) + if bias: + self.include_bias = True + self.register_buffer('bias', torch.zeros((outfeatures))) + else: + self.include_bias = False + self.bias = None + + self.register_buffer('lookup_table', torch.zeros((outfeatures, 2**self.bits), dtype=torch.float32)) + + #replacement forward pass + def forward(self, x): + if x.shape[-1] == x.numel(): + outshape = list(x.shape) + if self.bias is not None: + y = self.bias.clone() + outshape[-1] = self.bias.numel() + else: + y = torch.zeros((self.outfeatures), device='cuda', dtype=torch.float32) + outshape[-1] = self.outfeatures + dtype = x.dtype + if self.bits == 3: + x = x.float() + quant_cuda.vecquant3matmul_nuq_perchannel(x, self.qweight, y, self.lookup_table) + elif self.bits == 4: + x = x.float() + quant_cuda.vecquant4matmul_nuq_perchannel(x, self.qweight, y, self.lookup_table) + y = y.to(dtype) + return y.reshape(outshape) + else: + out_shape = x.shape[:-1] + (self.outfeatures, ) + x = x.reshape(-1,x.shape[-1]) + out = torch.zeros((x.shape[0], self.outfeatures), device='cuda', dtype=torch.float32) + dtype = x.dtype + if self.bits == 3: + x = x.float() + quant_cuda.vecquant3matmul_nuq_perchannel_batched(x, self.qweight, out, self.lookup_table) + elif self.bits == 4: + x = x.float() + quant_cuda.vecquant4matmul_nuq_perchannel_batched(x, self.qweight, out, self.lookup_table) + out = out.to(dtype) + out = out.reshape(out_shape) + out = out + self.bias if self.bias is not None else out + return out + +# function to iterate through model layers and replace with our LUT-based layer +def make_quant_lut(module, names, bits, name=''): + if isinstance(module, QuantLinearLUT): + return + for attr in dir(module): + tmp = getattr(module, attr) + name1 = name + '.' + attr if name != '' else attr + if name1 in names: + delattr(module, attr) + setattr(module, attr, QuantLinearLUT(bits, tmp.in_features, tmp.out_features, tmp.bias is not None)) + for name1, child in module.named_children(): + make_quant_lut(child, names, bits, name + '.' + name1 if name != '' else name1) diff --git a/squeezellm/quant_cuda.cpp b/squeezellm/quant_cuda.cpp new file mode 100644 index 0000000..dafb1eb --- /dev/null +++ b/squeezellm/quant_cuda.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +void vecquant3matmul_nuq_perchannel_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +); +void vecquant4matmul_nuq_perchannel_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +); +void vecquant3matmul_nuq_perchannel_batched_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +); +void vecquant4matmul_nuq_perchannel_batched_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +); + +void vecquant3matmul_nuq_perchannel( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_nuq_perchannel_cuda(vec, mat, mul, lookup_table); +} +void vecquant4matmul_nuq_perchannel( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_nuq_perchannel_cuda(vec, mat, mul, lookup_table); +} +void vecquant3matmul_nuq_perchannel_batched( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_nuq_perchannel_batched_cuda(vec, mat, mul, lookup_table); +} +void vecquant4matmul_nuq_perchannel_batched( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor lookup_table +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_nuq_perchannel_batched_cuda(vec, mat, mul, lookup_table); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("vecquant3matmul_nuq_perchannel", &vecquant3matmul_nuq_perchannel, "Non-Uniform Vector 3-bit Quantized Matrix Multiplication w/ Per-Channel LUT (CUDA)"); + m.def("vecquant4matmul_nuq_perchannel", &vecquant4matmul_nuq_perchannel, "Non-Uniform Vector 4-bit Quantized Matrix Multiplication w/ Per-Channel LUT (CUDA)"); + m.def("vecquant3matmul_nuq_perchannel_batched", &vecquant3matmul_nuq_perchannel_batched, "Non-Uniform Vector 3-bit Quantized Matrix Multiplication w/ Per-Channel LUT (CUDA)"); + m.def("vecquant4matmul_nuq_perchannel_batched", &vecquant4matmul_nuq_perchannel_batched, "Non-Uniform Vector 4-bit Quantized Matrix Multiplication w/ Per-Channel LUT (CUDA)"); +} diff --git a/squeezellm/quant_cuda_kernel.cu b/squeezellm/quant_cuda_kernel.cu new file mode 100644 index 0000000..f09b355 --- /dev/null +++ b/squeezellm/quant_cuda_kernel.cu @@ -0,0 +1,491 @@ +#include +#include +#include +#include +#include + +// half-tensor +#include +#include + +// atomicAdd for double-precision floating-point numbers on hardware with +// compute capability < 6.0 from: +// https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomic-functions +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 +__device__ double atomicAdd( + double* address, + double val +) { + unsigned long long int* address_as_ull = (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + + do { + assumed = old; + old = atomicCAS( + address_as_ull, + assumed, + __double_as_longlong(val + __longlong_as_double(assumed)) + ); + + // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) + } while (assumed != old); + + return __longlong_as_double(old); +} +#endif + +const int BLOCKWIDTH = 128; +const int BLOCKHEIGHT3 = 12; +const int BLOCKHEIGHT4 = 16; + +__device__ inline unsigned int as_unsigned(int i) { + return *reinterpret_cast(&i); +} + +__device__ inline int as_int(int i) { + return *reinterpret_cast(&i); +} + +__global__ void VecQuant3MatMulKernelNUQPerChannel( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width +); + +__global__ void VecQuant4MatMulKernelNUQPerChannel( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width +); + +__global__ void VecQuant3MatMulKernelNUQPerChannelBatched( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width, + int batch, + int vec_height +); + +__global__ void VecQuant4MatMulKernelNUQPerChannelBatched( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width, + int batch, + int vec_height +); + +void vecquant3matmul_nuq_perchannel_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor lookup_table +) { + int height = mat.size(0); + int width = mat.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + VecQuant3MatMulKernelNUQPerChannel<<>>( + vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + lookup_table.data_ptr(), + height, width + ); +} + +// 4-bit matvec kernel (LUT-based) +void vecquant4matmul_nuq_perchannel_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor lookup_table +) { + int height = mat.size(0); + int width = mat.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + VecQuant4MatMulKernelNUQPerChannel<<>>( + vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + lookup_table.data_ptr(), + height, width + ); +} + +// 3-bit batched matvec kernel (LUT-based) +void vecquant3matmul_nuq_perchannel_batched_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor lookup_table +) { + int height = mat.size(0); + int width = mat.size(1); + + int batch = vec.size(0); + int vec_height = vec.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + VecQuant3MatMulKernelNUQPerChannelBatched<<>>( + vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + lookup_table.data_ptr(), + height, width, batch, vec_height + ); +} + +// 4-bit batched matvec kernel (LUT-based) +void vecquant4matmul_nuq_perchannel_batched_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor lookup_table +) { + int height = mat.size(0); + int width = mat.size(1); + + int batch = vec.size(0); + int vec_height = vec.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + VecQuant4MatMulKernelNUQPerChannelBatched<<>>( + vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + lookup_table.data_ptr(), + height, width, batch, vec_height + ); +} + +__global__ void VecQuant3MatMulKernelNUQPerChannel( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width +) { + + int row = BLOCKHEIGHT3 * blockIdx.x; + int col = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ float blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[(row / BLOCKHEIGHT3) * BLOCKWIDTH + threadIdx.x]; + + //Modified dequant block + __shared__ float deq2[8][BLOCKWIDTH]; + int off = threadIdx.x; + int column_offset = col * 8; + for (int val = 0; val < 8; val += 1) { + int lut_index = column_offset + val; + deq2[val][off] = lookup_table[lut_index]; + } + + int i = width * row + col; + int k = 0; + + float res = 0; + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + + __syncthreads(); + + while (k < BLOCKWIDTH) { + tmp1 = as_unsigned(mat[i]); + + res += deq2[(tmp1 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp1 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp1 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp1 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp1 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp1 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp1 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp1 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp1 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp1 >> 27) & 0x7][off] * blockvec[k + 9]; + + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x4); + tmp2 >>= 1; + res += deq2[(tmp >> 0) & 0x7][off] * blockvec[k + 10]; + k += 11; + res += deq2[(tmp2 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp2 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp2 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp2 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp2 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp2 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp2 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp2 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp2 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp2 >> 27) & 0x7][off] * blockvec[k + 9]; + + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 30) | ((tmp1 << 1) & 0x6); + tmp1 >>= 2; + res += deq2[(tmp >> 0) & 0x7][off] * blockvec[k + 10]; + k += 11; + res += deq2[(tmp1 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp1 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp1 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp1 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp1 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp1 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp1 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp1 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp1 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp1 >> 27) & 0x7][off] * blockvec[k + 9]; + i += width; + k += 10; + } + + atomicAdd(&mul[col], res); +} + +//4-bit per-channel +__global__ void VecQuant4MatMulKernelNUQPerChannel( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width +) { + + int row = BLOCKHEIGHT4 * blockIdx.x; + int col = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ float blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[(row / BLOCKHEIGHT4) * BLOCKWIDTH + threadIdx.x]; + + //Modified dequant block + __shared__ float deq2[16][BLOCKWIDTH]; + int off = threadIdx.x; + int column_offset = col * 16; + for (int val = 0; val < 16; val += 1) { + int lut_index = column_offset + val; + deq2[val][off] = lookup_table[lut_index]; + } + + __syncthreads(); + + float res = 0; + int i = width * row + col; + int k = 0; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + res += deq2[(tmp >> 0) & 0xf][off] * blockvec[k + 0]; + res += deq2[(tmp >> 4) & 0xf][off] * blockvec[k + 1]; + res += deq2[(tmp >> 8) & 0xf][off] * blockvec[k + 2]; + res += deq2[(tmp >> 12) & 0xf][off] * blockvec[k + 3]; + res += deq2[(tmp >> 16) & 0xf][off] * blockvec[k + 4]; + res += deq2[(tmp >> 20) & 0xf][off] * blockvec[k + 5]; + res += deq2[(tmp >> 24) & 0xf][off] * blockvec[k + 6]; + res += deq2[(tmp >> 28) & 0xf][off] * blockvec[k + 7]; + + i += width; + k += 8; + } + + atomicAdd(&mul[col], res); +} + + +//batched version (3-bit) +__global__ void VecQuant3MatMulKernelNUQPerChannelBatched( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width, + int batch, + int vec_height +) { + + int row = BLOCKHEIGHT3 * blockIdx.x; + int col = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ float blockvec[BLOCKWIDTH]; + + __shared__ float deq2[8][BLOCKWIDTH]; + int off = threadIdx.x; + int column_offset = col * 8; + for (int val = 0; val < 8; val += 1) { + int lut_index = column_offset + val; + deq2[val][off] = lookup_table[lut_index]; + } + + int i; + float res; + int k; + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + + for (int b = 0; b < batch; ++b){ + //initialize vars + i = width * row + col; + res = 0; + k = 0; + + __syncthreads(); + blockvec[threadIdx.x] = vec[b * vec_height + (row / BLOCKHEIGHT3) * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + while (k < BLOCKWIDTH) { + tmp1 = as_unsigned(mat[i]); + + res += deq2[(tmp1 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp1 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp1 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp1 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp1 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp1 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp1 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp1 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp1 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp1 >> 27) & 0x7][off] * blockvec[k + 9]; + + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x4); + tmp2 >>= 1; + res += deq2[(tmp >> 0) & 0x7][off] * blockvec[k + 10]; + k += 11; + res += deq2[(tmp2 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp2 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp2 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp2 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp2 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp2 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp2 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp2 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp2 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp2 >> 27) & 0x7][off] * blockvec[k + 9]; + + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 30) | ((tmp1 << 1) & 0x6); + tmp1 >>= 2; + res += deq2[(tmp >> 0) & 0x7][off] * blockvec[k + 10]; + k += 11; + res += deq2[(tmp1 >> 0) & 0x7][off] * blockvec[k + 0]; + res += deq2[(tmp1 >> 3) & 0x7][off] * blockvec[k + 1]; + res += deq2[(tmp1 >> 6) & 0x7][off] * blockvec[k + 2]; + res += deq2[(tmp1 >> 9) & 0x7][off] * blockvec[k + 3]; + res += deq2[(tmp1 >> 12) & 0x7][off] * blockvec[k + 4]; + res += deq2[(tmp1 >> 15) & 0x7][off] * blockvec[k + 5]; + res += deq2[(tmp1 >> 18) & 0x7][off] * blockvec[k + 6]; + res += deq2[(tmp1 >> 21) & 0x7][off] * blockvec[k + 7]; + res += deq2[(tmp1 >> 24) & 0x7][off] * blockvec[k + 8]; + res += deq2[(tmp1 >> 27) & 0x7][off] * blockvec[k + 9]; + i += width; + k += 10; + } + + atomicAdd(&mul[b * width + col], res); + } +} + +//batched version (4-bit) +__global__ void VecQuant4MatMulKernelNUQPerChannelBatched( + const float* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ lookup_table, + int height, + int width, + int batch, + int vec_height +) { + + int row = BLOCKHEIGHT4 * blockIdx.x; + int col = BLOCKWIDTH * blockIdx.y + threadIdx.x; + __shared__ float blockvec[BLOCKWIDTH]; + + //Modified dequant block + __shared__ float deq2[16][BLOCKWIDTH]; + int off = threadIdx.x; + int column_offset = col * 16; + for (int val = 0; val < 16; val += 1) { + int lut_index = column_offset + (val & 0xf); + deq2[val][off] = lookup_table[lut_index]; + } + + int i; + float res; + int k; + unsigned int tmp; + + for (int b = 0; b < batch; ++b){ + i = width * row + col; + res = 0; + k = 0; + + __syncthreads(); + blockvec[threadIdx.x] = vec[b * vec_height + (row / BLOCKHEIGHT4) * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + res += deq2[(tmp >> 0) & 0xf][off] * blockvec[k + 0]; + res += deq2[(tmp >> 4) & 0xf][off] * blockvec[k + 1]; + res += deq2[(tmp >> 8) & 0xf][off] * blockvec[k + 2]; + res += deq2[(tmp >> 12) & 0xf][off] * blockvec[k + 3]; + res += deq2[(tmp >> 16) & 0xf][off] * blockvec[k + 4]; + res += deq2[(tmp >> 20) & 0xf][off] * blockvec[k + 5]; + res += deq2[(tmp >> 24) & 0xf][off] * blockvec[k + 6]; + res += deq2[(tmp >> 28) & 0xf][off] * blockvec[k + 7]; + + i += width; + k += 8; + } + + atomicAdd(&mul[b * width + col], res); + } +} diff --git a/squeezellm/setup_cuda.py b/squeezellm/setup_cuda.py new file mode 100644 index 0000000..6f05634 --- /dev/null +++ b/squeezellm/setup_cuda.py @@ -0,0 +1,10 @@ +from setuptools import setup, Extension +from torch.utils import cpp_extension + +setup( + name='quant_cuda', + ext_modules=[cpp_extension.CUDAExtension( + 'quant_cuda', ['quant_cuda.cpp', 'quant_cuda_kernel.cu'] + )], + cmdclass={'build_ext': cpp_extension.BuildExtension} +)