Share
Embed
Billion-scale similarity search with GPUs
近似近傍探索ライブラリ Faiss の元論文、"Billion-scale similarity search with GPUs" https://arxiv.org/abs/1702.08734 の紹介です。
Takuya Asano
November 14, 2018
Transcript
44 slides
-
Billion-scale similarity search with GPUs ୈ1ճ ߹ಉจಡΈձ (2018-11-14) հऀɿ ͯͳ
ઙ (id:takuya-a) -
ࣗݾհ • ΞΧϯτ • id:takuya-a • @takuya_b fka @takuya_a •
@takuyaa • ڵຯ • ݕࡧɾػցֶशɾNLP ͳͲ • ࣄ • ͯͳϒοΫϚʔΫ (2015-2018) • ήʔϜؔडୗ (2018-) • ΞυςΫ (2018-) -
Billion-scale similarity search with GPUs • ஶऀ • Jeff Johnson
(Facebook AI Research) • Matthijs Douze (Facebook AI Research) • Hervé Jégou (Facebook AI Research) • URL • https://arxiv.org/abs/1702.08734 -
എܠ • 10ԯΦʔμʔͷߴ࣍ݩϕΫτϧʢը૾ಈըͷಛྔͳͲʣʹରͯ͠ྨࣅ୳ࡧΛ͍ͨ͠ • ϕΫτϧͰ͋ΕͳΜͰΑ͍ • ࣍ݩͷढ͍ • ࣍ݩ͕ߴ͘ͳΔͱɺਖ਼֬ͳݕࡧ (exact
search) ͷख๏ઢܗ୳ࡧͱมΘΒͳ͍ܭࢉ࣌ؒʹͳΔ • ϝϞϦͨ͘͞ΜඞཁͳͷͰ Billion-scale Ͱෆద • ͍ΘΏΔۙࣅ࠷ۙ୳ࡧ (Approximate nearest neighbor search) Λ͍ͨ͠ -
ख๏ͷΞΠσΞ • ฒߦॲཧ͕ಘҙͳ GPU Λ͍ߴԽ • ͨͩ͠ɺGPU ϝϞϦ͕ݶΒΕ͍ͯΔ • ੵྔࢠԽ
(PQ; Product Quantization) [Jégou, TPAMI 2011] ʹΑΔίʔυԽΛߦ͏ • ߴ࣍ݩσʔλΛѹॖͯ͠ϝϞϦফඅྔΛݮ • ۙࣅʹΑΓॲཧߴԽ -
ରσʔληοτͷن • SIFT1M [1] • 128࣍ݩɺ100ສϕΫτϧ • SIFT1B [1] •
128࣍ݩɺ10ԯϕΫτϧ • DEEP1B [2] • 96࣍ݩɺ10ԯϕΫτϧ [1] http://corpus-texmex.irisa.fr/ [2] http://sites.skoltech.ru/compvision/noimi/ -
ྨࣅ୳ࡧͷΞϓϦέʔγϣϯ • ߴ࣍ݩσʔλͷݕࡧ • ը૾ SIFT, SURF ͳͲͷಛநग़Λߦͬͯߴ࣍ݩ • ୯ޠจॻͳͲͷࢄදݱ
• ΫϥελϦϯά • k-means ͷܭࢉͷϘτϧωοΫ࠷ۙ୳ࡧ • ࣮ࡍɺ Faiss ʹߴͳ k-means ͕࣮͞Ε͍ͯΔ • Ϩίϝϯυ -
ྨࣅݕࡧͷઃఆ • ΫΤϦϕΫτϧ x • l ݸͷϕΫτϧ͔ΒͳΔσʔλू߹ • ͜ͷத͔Βɺx ʹʮ͍ۙʯ
k ݸͷ෦ू߹ L Λݟ͚͍ͭͨ • ྨࣅݕࡧͰۙ͞ͷईʹϢʔΫϦουڑʢL2 ϊϧϜʣ͕ΘΕΔ • ͍ۙ͑͞ಘΒΕΕΑ͍ͷͰɺ Ͱൺֱͯ͠Α͍ L = k−argmin i=0:l ∥x − yi ∥2 [y]i=0:l ∥x − y∥2 2 -
NVIDIA GPU ͷมભ • Fermi (GF100, GF110, ...) • Kepler
(GK110, GK104, ...) • Maxwell (GM200, GM204, …) • Pascal (GP100, GP104) • Volta (GV100) <- New! • Turing (TU102, TU104, TU106) <- New! -
GP100 ͷߏ • GPC (Graphics Processing Cluster) x6 • TPC
(Texture Processing Cluster) x5 • SM (Streaming Multiprocessor) x2 • ΪΨεϨουΤϯδϯ x1 • σόΠεϝϞϦ (HBM2, 16 GB @ Tesla P100) x1 • L2 Ωϟογϡ (4 MB) x1 • ઃܭਤ্ SM 60ݸ͕ͩɺεϖοΫ্56ݸ • าཹ·Γ্ͷͨΊɺग़ՙ࣌ʹ 4 ݸແޮԽ͞ΕΔ NVIDIA Tesla P100 white paper: https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf -
SM (Streaming Multiprocessor) ͷߏ • Processing Unit x2 • CUDA
Core (FP32) x32 + DP Unit (FP64) x16 + LD/ST Unit x8 + SFU x8 • Warp εέδϡʔϥ x1 • σΟεύονϢχοτ x2 • ϨδελϑΝΠϧ x1 • L1Ωϟογϡ (24 KB) x1 • γΣΞʔυϝϞϦ (64 KB) x1 NVIDIA Tesla P100 white paper: https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf -
εϨου • GPU ʹ͓͚Δ࠷খ࣮ߦ୯Ґ • CUDA Core ͳͲͷݸʑͷ࣮ߦϢχοτʹσΟεύον͞ΕΔ • GPU
ͰઍʙສͷεϨουΛಉ࣌ʹ࣮ߦͰ͖Δ -
εϨουϒϩοΫ • 1ͭͷεϨουϒϩοΫʹ࠷େ 1,024 εϨου • SM ୯ҐͰεϨουϒϩοΫׂ͕ΓͯΒΕΔ • SM
ͷεϨουϒϩοΫͷׂΓͯΪΨε ϨουΤϯδϯ͕ߦ͏ Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़ʱɼٕज़ධࣾ -
εϨουͱ Warp • Warp GPU Ͱͷ࣮ߦ୯Ґ • 1 Warp
= 32 εϨου • 1εςοϓͰ·ͱΊ࣮ͯߦ͞ΕΔ • ΪΨεϨουΤϯδϯ͕ɺεϨουϒϩοΫ͔ Β Warp ΛऔΓग़ͯ͠ Warp Pool ʹೖΕΔ • Warp Pool ʹ࠷େ64ݸͷ Warp ΛόοϑΝ Ͱ͖Δ Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़ʱɼٕज़ධࣾ -
Warp εέδϡʔϥ • Warp Pool ͷத͔Β1ͭͷ Warp ΛબΜͰ࣮ߦ • ϩʔυ/ετΞͳͲʹʙेαΠΫϧඞཁ
• ͪ࣌ؒʹଞͷ Warp Λ࣮ߦ͢ΔΑ͏ʹεέ δϡʔϦϯά • GPU Ϧιʔεͷ༗ (occupancy) Λ࠷େԽ • Processing Unit ʹ2ͭͷ໋ྩσΟεύονϢ χοτ͕͋Γɺ2໋ྩΛಉ࣌ʹ࣮ߦ NVIDIA Kepler GK110 white paper: https://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf -
GP100 ͷϝϞϦγεςϜ • L1Ωϟογϡ • SM ͝ͱʹ1ͭ (24 KB) •
ʢఆͳͲΛ֨ೲʣ • ϥΠτ͢Δ߹γΣΞʔυϝϞϦΛ͏ • γΣΞʔυϝϞϦ • SM ͝ͱʹ1ͭ (64 KB) • ಉ͡ Warp ʢಉ͡εϨουϒϩοΫʣͷεϨου͔ΒࢀরͰ͖Δ Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़ʱɼٕज़ධࣾ -
GP100 ͷϝϞϦγεςϜ • L2 Ωϟογϡ • GPU ͝ͱʹ1ͭ (4 MB)
• σόΠεϝϞϦ • ཧతʹ GDDR, HBM2 ͳͲ • GPU ͝ͱʹ1ͭ (16 GB) Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़ʱɼٕज़ධࣾ -
GP100 ͷϝϞϦγεςϜ • ϨδελϑΝΠϧ • SM ͝ͱʹ 65,536 ΤϯτϦ x
32bit (256 KB) • ϨʔϯʢεϨουʣ͝ͱʹ͔Ε͍ͯΔ • Ϩʔϯ͝ͱʹ 2,048 ΤϯτϦ (8 KB) • εϨουϝϞϦͷόϯυ෯ΛಠͰ͖Δ Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़ʱɼٕज़ධࣾ -
γϟοϑϧ໋ྩ • γϟοϑϧ໋ྩΛ͏ͱϨʔϯΛӽ͑ͯϨδελͷஔ͕Մೳ • 1εςοϓͰྃ͢ΔͷͰγΣΞʔυϝϞϦΛ͏ΑΓߴ • ͜ͷ໋ྩΛͬͯιʔτΛߦ͏͜ͱ͕Ͱ͖Δʢޙड़ʣ NVIDIA Kepler GK110
white paper: https://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf -
ϧʔϑϥΠϯϞσϧ • ύϑΥʔϚϯεʹؔ͢ΔϞσϧ • ΞϧΰϦζϜ͕ϋʔυΣΞΛ͍͖ΕΔ͔ҎԼʹґଘ͢Δ • ϝϞϦͷόϯυ෯ • ϐʔΫੑೳ •
ϐʔΫੑೳΛग़͢ʹϝϞϦͷଳҬΛ͍ΕΔ͔Ͳ͏͔͕ॏཁ • -> ࠷ߴͳετϨʔδͰ͋ΔɺϨδελϑΝΠϧΛ͏ Roofline model - Wikipedia: https://en.wikipedia.org/wiki/Roofline_model -
4.1 In-register sorting • ϨδελϑΝΠϧͱγϟοϑϧ໋ྩΛͬͨߴͳฒྻιʔτ • ʢۙࣅʣڑΛܭࢉͨ͋͠ͱɺΫΤϦʹ͍ۙ k ݸͷϕΫτϧΛબ͢Δ (k-selection)
ͨΊ • ༏ઌ͖Ωϡʔͷ GPU ൛Έ͍ͨͳͷ -
Odd-size merging and sorting networks • Batcher's bitonic sorting network
ͷѥछΛ͏ • bitonicʢௐʣͰͳ͘ monotonicʢ୯ௐʣ • ҟͳΔཁૉͷྻͲ͏͠ͰιʔτՄೳ • Bitonic sorting network ʹ͍ͭͯ [Batcher68] Λࢀর • Bitonic mergesort • https://en.wikipedia.org/wiki/Bitonic_sorter • Bitonic sort • https://t-pot.com/program/90_BitonicSort/index.html -
Odd-size network merging MERGE-ODD γϟοϑϧ໋ྩ Ͱ࣮ߦՄೳ step 1 step 2-4
MERGE-ODD: ҎԼͷΑ͏ʹ2ͭͷྻΛड͚औͬͯ ιʔτ͢ΔΞϧΰϦζϜ -
4.2 WarpSelect • k-selection Λ GPU Ͱฒྻ࣮ߦ͢ΔΞϧΰϦζϜ • Ϩʔϯ͝ͱʹ͔ΕͨσʔλߏΛ͏ •
ͯ͢Ϩδελʹஔ͘ • ࠷େͰ (k + 32t + 32) ݸͷཁૉ • Thread queue • ֤εϨου͕ͭΩϡʔ • ࠷খͷ t ݸͷΛอ࣋ • Warp queue • ϫʔϓؒͰڞ༗͢ΔΩϡʔ • ࠷খͷ k ݸͷΛอ࣋ ͞ t େ খ খ େ -
4.2 WarpSelect Ϩʔϯ͝ͱʹ࣮ߦ͞ΕΔίʔυ ͞ t େ খ খ େ Thread
queue ʹೖͬͯ ͍ͨΛฒྻιʔτ ιʔτࡁΈ Thread queue ͱ Warp queue ΛϚʔδιʔτ 32εϨουͰಉ࣮࣌ߦͰ͖ΔΑ͏ Thread queue ͷ t ݸͷΛ ॱ൪ʹͳΔΑ͏ʹγϟοϑϧ໋ྩͰ ٧Ί͢ -
5.1 Exact search • ϒϧʔτϑΥʔεʹΑΔݫີͳݕࡧ • 3߲ͷੵܭࢉ͕ॏ͍ • ͯ͢ͷ x,
y ͷʹ͍ͭͯܭࢉ͢ΔͨΊɺ XYT ͷߦྻԋࢉͱಉ͡ • cuBLAS ͷ GEMM (GEneral Matrix to Matrix Multiplication) ϧʔνϯΛ༻ • খ͞ͳσʔληοτʹର࣮ͯ͠༻త • ͷͪ΄Ͳ IVFADC ͷૈ͍ྔࢠԽ (coarse quantizer) ͷͨΊʹ͏ -
5.2 IVFADC indexing • ੵྔࢠԽ (PQ; Product Quantization) Λͬͨσʔλߏ •
PQ code ͷྻͱɺͦΕʹඥͮ͘ ID Λอ࣋͢Δྻ • ৄࡉҎԼͷࢿྉ͕ৄ͍͠ • দҪ༐༎ (2018) ʰbillion-scaleͷۙࣅ࠷ۙ୳ࡧʱ http://yusukematsui.me/project/survey_pq/doc/ ann_billion_2018.pdf -
IVFADC (Inverted File system with Asymmetric Distance Computation) • ૈ͍ྔࢠԽʹΑΔϋογϡϚοϓ
• సஔϦετ (inverted list) ʹ ID ͱ PQ codeΛอଘ͢Δ • Inverted file ͷ෦ͷཁૉগͳ͍ • CPU ͰͳΊͯίετখ͍͞ • ૈ͍ྔࢠԽޙͷసஔϦετʹରͯۙ͠ࣅۙݕࡧ • GPU Λͬͯฒྻܭࢉʢલड़ʣ [Jegou+11] https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf -
6.1 k-selection performance • εϞʔϧσʔλʹର͢Δ k-selection ͷύϑΥʔϚϯε • ܭࢉػڥ •
2x 2.8GHz Xeon E5-2680v2 • 4x Maxwell Titan X on CUDA 8.0 • ύϥϝʔλ • όονʹؚ·ΕΔΫΤϦ nq = 10,000 • k = 100 or 1,000 • ൺֱͨ͠ϥΠϒϥϦ • Truncated Bitonic Sort (TBiS) • fgknn -
6.2 k-means clustering • k = 1 ͷ k-means ΫϥελϦϯά
• σʔλ MNIST8m • 810 ສຕͷ 28 x 28 ը૾ʢ784 ࣍ݩʣ • GPU ͕͑Δ BIDMach ͱൺֱ • ͲͪΒ cuBLAS ͕ΘΕ͍ͯΔ • 2ഒҎ্ߴ -
6.3 Exact nearest neighbor search • SIFT1M • 100ສ݅ͷը૾ •
128࣍ݩ • nq = 10,000 -
6.4 Billion-scale approximate search • DEEP1B (10ԯϕΫτϧ, 96࣍ݩ, nq =
10,000) • [Babenko&Lempitsky16]: R@1 = 0.45, 20 msec • ఏҊख๏: R@1 = 0.4517, 0.0133 msec • SIFT1M (100ສϕΫτϧ, 128࣍ݩ) • [Wieschollek+16] ͷख๏ͱൺֱ • ಉ࣌ؒ͡ (0.02 msec) ʹରͯ͠ • [Wieschollek+16]: R@1 = 0.51, R@100 = 0.86 • ఏҊख๏: R@1 = 0.80, R@100 = 0.95 • SIFT1B (10ԯϕΫτϧ, 128࣍ݩ, nq = 10,000) • [Wieschollek+16]: R@10 = 0.35, 150 μsec • ఏҊख๏: R@10 = 0.376, 17.7 μsec • ಉఔͷ recall Λୡ͠ͳ͕Β 8.5 ഒߴ https://github.com/facebookresearch/faiss/wiki/Indexing-1G-vectors#deep1b -
ࢀߟจݙ • NVIDIA Tesla P100 white paper https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf • NVIDIA
Kepler GK110 white paper https://www.nvidia.co.jp/content/apac/pdf/tesla/nvidia-kepler-gk110-architecture-whitepaper-jp.pdf • Hisa Ando (2017) ʰGPUΛࢧ͑Δٕज़――ฒྻϋʔυΣΞͷշਐܸʦٕज़جૅʧʱɼٕज़ධࣾ http://gihyo.jp/book/2017/978-4-7741-9056-3 • [Batcher68] K. E. Batcher. 1968. Sorting networks and their applications. In Proceedings of the April 30--May 2, 1968, spring joint computer conference (AFIPS '68 (Spring)). ACM, New York, NY, USA, 307-314. DOI=http://dx.doi.org/10.1145/1468075.1468121 • [Jegou+11] Herve Jegou, Matthijs Douze, and Cordelia Schmid. 2011. Product Quantization for Nearest Neighbor Search. IEEE Trans. Pattern Anal. Mach. Intell. 33, 1 (January 2011), 117-128. DOI: https://doi.org/10.1109/TPAMI.2010.57 • [Wieschollek+16] P. Wieschollek, O. Wang, A. Sorkine-Hornung, and H. P. A. Lensch. Ecient large-scale approximate nearest neighbor search on the GPU. In Proc. IEEE Conference on Computer Vision and Pattern Recognition, pages 2027-2035, June 2016. • [Babenko&Lempitsky16] A. Babenko and V. Lempitsky. Ecient indexing of billion-scale datasets of deep descriptors. In Proc. IEEE Conference on Computer Vision and Pattern Recognition, pages 2055-2063, June 2016.