# vqtorch **Repository Path**: code-tmp/vqtorch ## Basic Information - **Project Name**: vqtorch - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-23 - **Last Updated**: 2025-08-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

--- VQTorch is a PyTorch library for vector quantization. The library was developed and used for. - `[1] Straightening Out the Straight-Through Estimator: Overcoming Optimization Challenges in Vector Quantized Networks, Huh et al. ICML2023` ## Installation Development was done on Ubuntu with Python 3.9/3.10 using NVIDIA GPUs. Some requirements may need to be adjusted in order to run. Some features, such as half-precision cdist and cuda-based kmeans, are only supported on CUDA devices. First install the correct version of [cupy](https://github.com/cupy/cupy/). Make sure to install the correct version. The version refers to `CUDA Version` number when using the command `nvidia-smi`. `cupy` seem to now support ROCm drivers but this has not been tested. ```bash # recent 12.x cuda versions pip install cupy-cuda12x # 11.x versions (for even older see the repo above) pip install cupy-cuda11x ``` Next, install `vqtorch` ```bash git clone https://github.com/minyoungg/vqtorch cd vqtorch pip install -e . ``` ## Example usage For examples using `VectorQuant` for classification and auto-encoders check out [here](./examples/). ```python import torch from vqtorch.nn import VectorQuant print('Testing VectorQuant') # create VQ layer vq_layer = VectorQuant( feature_size=32, # feature dimension corresponding to the vectors num_codes=1024, # number of codebook vectors beta=0.98, # (default: 0.9) commitment trade-off kmeans_init=True, # (default: False) whether to use kmeans++ init norm=None, # (default: None) normalization for the input vectors cb_norm=None, # (default: None) normalization for codebook vectors affine_lr=10.0, # (default: 0.0) lr scale for affine parameters sync_nu=0.2, # (default: 0.0) codebook synchronization contribution replace_freq=20, # (default: None) frequency to replace dead codes dim=-1, # (default: -1) dimension to be quantized ).cuda() # when `kmeans_init=True` is recommended to warm up the codebook before training with torch.no_grad(): z_e = torch.randn(128, 8, 8, 32).cuda() vq_layer(z_e) # standard forward pass z_e = torch.randn(128, 8, 8, 32).cuda() z_q, vq_dict = vq_layer(z_e) print(vq_dict.keys) >>> dict_keys(['z', 'z_q', 'd', 'q', 'loss', 'perplexity']) ``` ## Supported features - `vqtorch.nn.GroupVectorQuant` - Vectors are quantized by first partitioning into `n` subvectors. - `vqtorch.nn.ResidualVectorQuant` - Vectors are first quantized and the residuals are repeatedly quantized. - `vqtorch.nn.MaxVecPool2d` - Pools along the vector dimension by selecting the vector with the maximum norm. - `vqtorch.nn.SoftMaxVecPool2d` - Pools along the vector dimension by the weighted average computed by softmax over the norm. - `vqtorch.no_vq` - Disables all vector quantization layers that inherit `vqtorch.nn._VQBaseLayer` ```python model = VQN(...) with vqtorch.no_vq(): out = model(x) ``` ## Experimental features - Group affine parameterization: divides the codebook into groups. The individual group is reparameterized with its own affine parameters. One can invoke it via ```python vq_layer = VectorQuant(..., affine_groups=8) ``` - In-place alternated optimization: in-place codebook during the forward pass. ```python inplace_optimizer = lambda *args, **kwargs: torch.optim.SGD(*args, **kwargs, lr=50.0, momentum=0.9) vq_layer = VectorQuant(inplace_optimizer=inplace_optimizer) ``` ## Planned features We aim to incorporate commonly used VQ methods, including probabilistic VQ variants. ## Citations If the features such as `affine parameterization`, `synchronized commitment loss` or `alternating optimization` was useful, please consider citing ```bibtex @inproceedings{huh2023improvedvqste, title={Straightening Out the Straight-Through Estimator: Overcoming Optimization Challenges in Vector Quantized Networks}, author={Huh, Minyoung and Cheung, Brian and Agrawal, Pulkit and Isola, Phillip}, booktitle={International Conference on Machine Learning}, year={2023}, organization={PMLR} } ``` If you found the library useful please consider citing ```bibtex @misc{huh2023vqtorch, author = {Huh, Minyoung}, title = {vqtorch: {P}y{T}orch Package for Vector Quantization}, year = {2022}, howpublished = {\url{https://github.com/minyoungg/vqtorch}}, } ```