Skip to content

Instantly share code, notes, and snippets.

@mdouze
Last active February 27, 2023 19:10
Show Gist options
  • Save mdouze/b0a65aba70a64b00d6425b0e268a4c80 to your computer and use it in GitHub Desktop.
Save mdouze/b0a65aba70a64b00d6425b0e268a4c80 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import faiss\n",
"from matplotlib import pyplot"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"# create an inverted index\n",
"nlist = 1024\n",
"m = 8\n",
"k = 5\n",
"d = 64\n",
"coarse_quantizer = faiss.IndexFlatL2(d)\n",
"index = faiss.IndexIVFPQ(coarse_quantizer, d, nlist, m, 8)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"# fill it in\n",
"xb = faiss.rand((10000, d), 1234)\n",
"index.train(xb)\n",
"index.add(xb)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"# if there is a pre-transform, you can also use\n",
"# invlists = faiss.extract_index_ivf(index).invlists\n",
"invlists = index.invlists"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# invlist sizes histogram\n",
"bc = np.bincount([invlists.list_size(l) for l in range(invlists.nlist)])\n",
"pyplot.step(np.arange(bc.size), bc)\n",
"pyplot.xlabel('size of invlist')\n",
"pyplot.ylabel('nb of invlists')\n",
"pyplot.grid()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"def get_invlist(invlists, l):\n",
" \"\"\" returns the inverted lists content. \n",
" That the data is *not* copied: if the inverted index is deallocated or changes, accessing the array may crash.\n",
" To avoid this, just clone the output arrays on output. \"\"\"\n",
" ls = invlists.list_size(l)\n",
" list_ids = faiss.rev_swig_ptr(invlists.get_ids(l), ls)\n",
" list_codes = faiss.rev_swig_ptr(invlists.get_codes(l), ls * invlists.code_size)\n",
" return list_ids, list_codes"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# get content of inverted list #123\n",
"list_ids, list_codes = get_invlist(invlists, 124)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 375, 764, 1691, 1736, 2281, 2532, 2573, 2758, 3711, 3791, 6206,\n",
" 7364, 8009, 8828, 8849, 8865, 8988])"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# vector ids in the list\n",
"list_ids"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[124],\n",
" [124]])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check that vectors 375 and 764 are indeed quantized to list 124\n",
"coarse_quantizer.assign(xb[[375, 764]], 1)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[135, 86, 175, 251, 122, 220, 0, 250],\n",
" [ 22, 168, 238, 229, 218, 24, 93, 209],\n",
" [226, 69, 61, 81, 162, 71, 218, 237],\n",
" [130, 201, 27, 255, 8, 85, 177, 104],\n",
" [ 53, 234, 190, 153, 109, 126, 54, 64],\n",
" [124, 124, 34, 124, 205, 124, 124, 54],\n",
" [ 92, 225, 123, 105, 152, 116, 26, 118],\n",
" [100, 118, 163, 109, 160, 130, 109, 210],\n",
" [114, 236, 59, 14, 183, 243, 186, 154],\n",
" [160, 95, 1, 31, 23, 82, 232, 251],\n",
" [ 98, 235, 85, 201, 87, 231, 139, 1],\n",
" [ 42, 58, 54, 51, 13, 217, 23, 217],\n",
" [240, 155, 77, 147, 29, 216, 216, 103],\n",
" [150, 163, 70, 80, 187, 14, 202, 237],\n",
" [ 84, 60, 29, 76, 107, 103, 180, 63],\n",
" [ 58, 150, 5, 216, 136, 3, 74, 53],\n",
" [ 54, 241, 31, 126, 195, 38, 63, 148]], dtype=uint8)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# PQ codes stored in the inverted lists\n",
"list_codes.reshape(-1, invlists.code_size)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@mdouze
Copy link
Author

mdouze commented Aug 31, 2020

A function that properly copies the data:

def get_invlist(invlists, l):
    """ returns the inverted lists content. """
    ls = invlists.list_size(l)
    list_ids = np.zeros(ls, dtype='int64')
    x = invlists.get_ids(l)
    faiss.memcpy(faiss.swig_ptr(list_ids), x, list_ids.nbytes)
    invlists.release_ids(l, x)
    x = invlists.get_codes(l)
    list_codes = np.zeros((ls, invlists.code_size), dtype='uint8')
    faiss.memcpy(faiss.swig_ptr(list_codes), x, list_codes.nbytes)
    invlists.release_codes(l, x)    
    return list_ids, list_codes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment