PQ

View as Markdown

Source header: cuvs/preprocessing/quantize/pq.hpp

Product Quantizer utilities

kmeans_params_variant

Alias for the variant holding either balanced or regular k-means parameters.

1using kmeans_params_variant =
2std::variant<cuvs::cluster::kmeans::balanced_params, cuvs::cluster::kmeans::params>;

preprocessing::quantize::pq::params

Product Quantizer parameters.

1struct params { ... };

Fields

NameTypeDescription
pq_bitsuint32_tThe bit length of the vector element after compression by PQ. Possible value range: [4-16]. Hint: the smaller the ‘pq_bits’, the smaller the index size and the faster the fit/transform time, but the lower the recall.
pq_dimuint32_tThe dimensionality of the vector after compression by PQ. When zero, dim / 4 is used as default. TODO: at the moment dim must be a multiple pq_dim.
use_subspacesboolWhether to use subspaces for product quantization (PQ). When true, one PQ codebook is used for each subspace. Otherwise, a single PQ codebook is used.
use_vqboolWhether to use Vector Quantization (KMeans) before product quantization (PQ). When true, VQ is used and PQ is trained on the residuals.
vq_n_centersuint32_tVector Quantization (VQ) codebook size - number of “coarse cluster centers”. When zero, an optimal value is selected using a heuristic. (sqrt(n_rows))
kmeans_paramskmeans_params_variantK-means parameters for PQ codebook training. Set to cuvs::cluster::kmeans::balanced_params for balanced k-means (default), or cuvs::cluster::kmeans::params for regular k-means. The active variant type selects the algorithm; balanced k-means tends to be faster for PQ training where cluster sizes are approximately equal. Only L2Expanded metric is supported. The number of clusters is always set to 1 << pq_bits.
max_train_points_per_pq_codeuint32_tThe max number of data points to use per PQ code during PQ codebook training. Using more data points per PQ code may increase the quality of PQ codebook but may also increase the build time. We will use pq_n_centers * max_train_points_per_pq_code training points to train each PQ codebook.
max_train_points_per_vq_clusteruint32_tThe max number of data points to use per VQ cluster during training.

preprocessing::quantize::pq::params::params

Simplified constructor that will build an appropriate kmeans params object.

1params(uint32_t pq_bits,
2uint32_t pq_dim,
3bool use_subspaces,
4bool use_vq,
5uint32_t vq_n_centers,
6uint32_t kmeans_n_iters,
7cuvs::cluster::kmeans::kmeans_type pq_kmeans_type =
8cuvs::cluster::kmeans::kmeans_type::KMeansBalanced,
9uint32_t max_train_points_per_pq_code = 256,
10uint32_t max_train_points_per_vq_cluster = 1024)
11: pq_bits(pq_bits),

Parameters

NameDirectionTypeDescription
pq_bitsuint32_t
pq_dimuint32_t
use_subspacesbool
use_vqbool
vq_n_centersuint32_t
kmeans_n_itersuint32_t
pq_kmeans_typecuvs::cluster::kmeans::kmeans_typeDefault: cuvs::cluster::kmeans::kmeans_type::KMeansBalanced.
max_train_points_per_pq_codeuint32_tDefault: 256.
max_train_points_per_vq_clusteruint32_tDefault: 1024.

Returns

void

preprocessing::quantize::pq::quantizer

Defines and stores VPQ codebooks upon training

1template <typename T>
2struct quantizer { ... };

Fields

NameTypeDescription
params_quantizerparamsParameters used to build this quantizer.
vpq_codebookscuvs::neighbors::vpq_dataset<T, int64_t>VPQ codebooks produced during training.

preprocessing::quantize::pq::build

Initializes a product quantizer to be used later for quantizing the dataset.

1quantizer<float> build(raft::resources const& res,
2const params params,
3raft::device_matrix_view<const float, int64_t> dataset);

The use of a pool memory resource is recommended for more consistent training performance.

Usage example:

Parameters

NameDirectionTypeDescription
resinraft::resources const&raft resource
paramsinconst paramsconfigure product quantizer, e.g. quantile
datasetinraft::device_matrix_view<const float, int64_t>a row-major matrix view on device or host

Returns

quantizer<float>

Additional overload: preprocessing::quantize::pq::build

1quantizer<float> build(raft::resources const& res,
2const params params,
3raft::host_matrix_view<const float, int64_t> dataset);

Parameters

NameDirectionTypeDescription
resraft::resources const&
paramsconst params
datasetraft::host_matrix_view<const float, int64_t>

Returns

quantizer<float>

preprocessing::quantize::pq::transform

Applies quantization transform to given dataset

1void transform(raft::resources const& res,
2const quantizer<float>& quant,
3raft::device_matrix_view<const float, int64_t> dataset,
4raft::device_matrix_view<uint8_t, int64_t> codes_out,
5std::optional<raft::device_vector_view<uint32_t, int64_t>> vq_labels = std::nullopt);

Usage example:

used, optional

Parameters

NameDirectionTypeDescription
resinraft::resources const&raft resource
quantinconst quantizer<float>&a product quantizer
datasetinraft::device_matrix_view<const float, int64_t>a row-major matrix view on device or host
codes_outoutraft::device_matrix_view<uint8_t, int64_t>a row-major matrix view on device containing the PQ codes
vq_labelsoutstd::optional<raft::device_vector_view<uint32_t, int64_t>>a vector view on device containing the VQ labels when VQ is Default: std::nullopt.

Returns

void

Additional overload: preprocessing::quantize::pq::transform

1void transform(raft::resources const& res,
2const quantizer<float>& quant,
3raft::host_matrix_view<const float, int64_t> dataset,
4raft::device_matrix_view<uint8_t, int64_t> codes_out,
5std::optional<raft::device_vector_view<uint32_t, int64_t>> vq_labels = std::nullopt);

Parameters

NameDirectionTypeDescription
resraft::resources const&
quantconst quantizer<float>&
datasetraft::host_matrix_view<const float, int64_t>
codes_outraft::device_matrix_view<uint8_t, int64_t>
vq_labelsstd::optional<raft::device_vector_view<uint32_t, int64_t>>Default: std::nullopt.

Returns

void

preprocessing::quantize::pq::get_quantized_dim

Get the dimension of the quantized dataset (in bytes)

1inline int64_t get_quantized_dim(const params& config);

Parameters

NameDirectionTypeDescription
configinconst params&product quantizer parameters

Returns

inline int64_t

the dimension of the quantized dataset

preprocessing::quantize::pq::inverse_transform

Applies inverse quantization transform to given dataset

1void inverse_transform(
2raft::resources const& res,
3const quantizer<float>& quant,
4raft::device_matrix_view<const uint8_t, int64_t> pq_codes,
5raft::device_matrix_view<float, int64_t> out,
6std::optional<raft::device_vector_view<const uint32_t, int64_t>> vq_labels = std::nullopt);

Parameters

NameDirectionTypeDescription
resinraft::resources const&raft resource
quantinconst quantizer<float>&a product quantizer
pq_codesinraft::device_matrix_view<const uint8_t, int64_t>a row-major matrix view on device containing the PQ codes
outoutraft::device_matrix_view<float, int64_t>a row-major matrix view on device
vq_labelsinstd::optional<raft::device_vector_view<const uint32_t, int64_t>>a vector view on device containing the VQ labels when VQ is used, optional Default: std::nullopt.

Returns

void