Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Nächste SlideShare
What to Upload to SlideShare
Weiter
Herunterladen, um offline zu lesen und im Vollbildmodus anzuzeigen.

4

Teilen

Herunterladen, um offline zu lesen

TOROS N2 - lightweight approximate Nearest Neighbor library

Herunterladen, um offline zu lesen

김성진(nick.kim) / kakao corp.(추천팀)
카카오 추천팀에서 개발한 근사 최근접 이웃 라이브러리 TOROS N2를 소개합니다.
https://github.com/kakao/n2

Ähnliche Bücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Ähnliche Hörbücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

TOROS N2 - lightweight approximate Nearest Neighbor library

  1. 1. TOROS N2 - lightweight Approximate k-Nearest Neighbor library 김성진(nick.kim) kakao corp.(추천팀)
  2. 2. 유사한 아이템 ( Nearest Neighbor )
  3. 3. 출처: https://brunch.co.kr/@notepetinbnet/88 이 글을 읽은 유저에게 어떤 글을 추천할 수 있을까?
  4. 4. 출처: https://brunch.co.kr/@notepetinbnet/88 여러 가지 방법으로 추천할 수 있겠지만, 1. 이 글과 유사한 글을 추천한다. 2. 이 글을 읽은 사람들이 읽은 글을 추천한다. 3.
  5. 5. 출처: https://brunch.co.kr/@notepetinbnet/88 이번 발표에서는 1번 케이스에 집중 1. 이 글과 유사한 글을 추천한다. 2. 이 글을 읽은 사람들이 읽은 글을 추천한다. 3.
  6. 6. 유사한 글 출처 (왼쪽부터) - https://brunch.co.kr/@me7686/7 - https://brunch.co.kr/@theka6/323 - https://brunch.co.kr/@caroute/153 유사하지 않은 글
  7. 7. 유사한 아이템 찾기 ( Nearest Neighbor Search )
  8. 8. 벡터 모델 • 각 아이템을 f-차원의 벡터로 표현 • 벡터로 표현하면, 각 아이템 간의 거리를 계산할 수 있음 • 거리 계산이 가능해지면, 거리가 가장 가까운 아이템을 찾으면 됨
  9. 9. 벡터로 표현? • 텍스트 • Word embedding (word2vec, ) • 이미지 • 학습된 네트웤에서 특정 레이어 가져오기
  10. 10. 앞의 예시 글들을 2차원 벡터로 표현했다고 하면 [0.2, 0.8] [0.15, 0.7] [0.1, 0.9] [0.7, 0.3]
  11. 11. 벡터로 표현된 글들은 2차원 평면에 점으로 그릴 수 있겠죠
  12. 12. 각 글 간의 거리를 계산할 수도 있겠죠
  13. 13. 거리가 가까우면 유사한 것 0.112
  14. 14. 거리가 멀면 유사하지 않은 것 0.707
  15. 15. k개의 유사한 아이템 찾기 ( k-Nearest Neighbor Search )
  16. 16. kNN 활용 예시 • 글 A 와 유사한 것 10개 찾아줘 • 유저 B 와 서비스 이용패턴이 비슷한 사람 1000명 찾아줘 => 유사 아이템(글, 사진, 유저) 찾아야 하는 것을 벡터로 표현 한 뒤, 인접한 이웃을 찾아주면 끝
  17. 17. 주어진 임의의 벡터에 대해
  18. 18. k개의 가장 인접한 벡터를 찾는 것
  19. 19. 실제로 구하려면 (Brute force version)
  20. 20. 모든 아이템과의 거리를 계산한 뒤
  21. 21. 가장 거리가 가까운 k개 선택
  22. 22. Brute Force kNN
  23. 23. 100차원 벡터 100만개가 있을때 여기서부터 여기까지 수행하는데 AWS c5.4xlarge 기준 0.1초
  24. 24. 모든아이템(100만건)의최근접이웃을찾으려면? > 0.1초 * 100만 = 27.7시간
  25. 25. 모든아이템(100만건)의최근접이웃을찾으려면? > 0.1초 * 100만 = 27.7시간 > 현실적으로 사용 불가능
  26. 26. Brute force보다 빠른 속도로 찾는 방법은 없을까?
  27. 27. 최근접 이웃 중 일부는 못 찾아도 괜찮으니, Brute force보다 훨씬 빠른 속도로 찾는 방법은 없을까?
  28. 28. 근사해서 k개의 유사한 아이템 찾기 ( Approximate k-Nearest Neighbor Search )
  29. 29. k=5 라면, 이게 정답이지만
  30. 30. 이렇게 찾더라도, 100배 빠르면 괜찮다! 이 경우, 정확도는 80% (= 4/5)
  31. 31. 근사해서 찾기 때문에, 이 접근 방법을 Approximate k-Nearest Neighbor (AkNN) 라고 부릅니다.
  32. 32. 모든아이템(100만건)의최근접이웃을찾으려면? Brute Force > 0.1초 * 100만 = 27.7시간 AkNN > 0.001초 * 100만 = 16.6분
  33. 33. https://github.com/erikbern/ann-benchmarks#glove-100-angular
  34. 34. https://github.com/erikbern/ann-benchmarks#glove-100-angular Queries per second ( 1 / s ) > 초당 수행한 쿼리 수
  35. 35. 쿼리 1건: 벡터 하나의 최근접 이웃을 찾는 것 여기서부터 여기까지 수행하는게 쿼리 1건
  36. 36. https://github.com/erikbern/ann-benchmarks#glove-100-angular Recall > 맞춘 개수 / 정답 개수
  37. 37. 정답 개수: 5개
  38. 38. 맞춘 개수: 4개
  39. 39. 정답 개수: 5개 맞춘 개수: 4개 > Recall = 4/5 = 0.8
  40. 40. https://github.com/erikbern/ann-benchmarks#glove-100-angular Brute Force
  41. 41. https://github.com/erikbern/ann-benchmarks#glove-100-angular HNSW (Approximate kNN 알고리즘 중 하나)
  42. 42. https://github.com/erikbern/ann-benchmarks#glove-100-angular
  43. 43. https://github.com/erikbern/ann-benchmarks#glove-100-angular 0.93 Recall 7%를 잃는 대신
  44. 44. https://github.com/erikbern/ann-benchmarks#glove-100-angular 0.93 Recall 7%를 잃는 대신 속도는 100배 이상 빨라집니다
  45. 45. 정리: Approximate k-Nearest Neighbor Search • 아이템을 벡터로 표현하면 아이템 간 거리를 계산할 수 있음 • 아이템 간 거리 계산을 통해 가장 가까운 이웃을 찾을 수 있음 • 거리를 계산해야 할 대상이 너무 많으면 근사해서 빠르게 찾을 수 있음 • 대략 90%의 정확도로 100배 빠르게 찾을 수 있음
  46. 46. AkNN 패키지들 (Approximate k-Nearest Neighbor Search)
  47. 47. Annoy nmslib 장점 • MMAP 지원 • 쓰기 쉬움 • HNSW 알고리즘 지원 단점 • 성능이 아쉬움 • MMAP 미지원 • 불편한 interface • 복잡한 설치과정
  48. 48. Annoy • https://github.com/spotify/annoy • Random projection + Tree • 장점 • 적은 수의 hyper parameter • Read-only MMaped data structure 지원 • 다수의 프로세스가 모델 파일을 공유할 수 있음 • 사용하기 쉬움 • 단점 • 최신 라이브러리들에 비해 떨어지는 성능(속도, 정확도)
  49. 49. Disk Mem MMap이 지원되지 않는 경우
  50. 50. MMap이 지원되지 않는 경우 Disk Mem Load Process1
  51. 51. Disk Mem Load Process1 Process2 MMap이 지원되지 않는 경우
  52. 52. Disk Mem Load Process1 Process2 MMap이 지원되지 않는 경우 Process3
  53. 53. Disk Mem MMap이 지원되는 경우
  54. 54. Disk Mem MMap이 지원되는 경우 Process1 Mapping
  55. 55. Disk Mem MMap이 지원되는 경우 Process1 Process2 Mapping
  56. 56. Disk Mem MMap이 지원되는 경우 Process1 Process2 Mapping Process3
  57. 57. nmslib • https://github.com/nmslib/nmslib • 장점 • 속도, 정확도 우수한 HNSW 알고리즘 지원 • 단점 • MMap 미지원 • 초기 버전은 설치 복잡했음 (Boost, GSL, ) • 현재는 개선됨
  58. 58. https://github.com/erikbern/ann-benchmarks#glove-100-angular 속도, 정확도에서는 Annoy < HNSW Annoy hnsw(nmslib)
  59. 59. Annoy nmslib 장점 • MMAP 지원 • 쓰기 쉬움 • HNSW 알고리즘 지원 단점 • 성능이 아쉬움 • MMAP 미지원 • 불편한 interface • 복잡한 설치과정
  60. 60. Annoy nmslib 장점 • MMAP 지원 • 쓰기 쉬움 • HNSW 알고리즘 지원 단점 • 성능이 아쉬움 • MMAP 미지원 • 불편한 interface • 복잡한 설치과정 장점만 가져올 수는 없을까? > 만들어 보자!
  61. 61. TOROS N2
  62. 62. TOROS N2 • https://github.com/kakao/n2 • 장점 • HNSW 알고리즘 지원 • MMAP 지원 • 빠른 Index Build 속도 (nmslib 대비 55% 빠름) • 설치 & 사용 간편 • Python, Go binding • 단점 • Search 속도는 nmslib이 빠름 (빌드 속도와 trade-off 가능)
  63. 63. Why N2? - N이 2개라서… Approximate k-Nearest Neighbor
  64. 64. Timeline annoy (2013) HNSW 페이퍼 (2016) HNSW (nmslib) (2016.04) n2 개발 (2016.12) n2 오픈소스화 (2017.09)
  65. 65. nmslib (2017) nmslib(2018) n2(2017) 장점 • HNSW 알고리즘 지원 • HNSW 구현체 중 가 장 빠른 Search 속도 • HNSW 알고리즘 지원 • 빠른 Build 속도 • MMAP 지원 • 설치/인터페이스 간편 단점 • MMAP 미지원 • 불편한 interface • 복잡한 설치과정 • MMAP 미지원 그 사이에 nmslib도 많이 좋아졌어요
  66. 66. https://github.com/erikbern/ann-benchmarks#glove-100-angular HNSW 구현체들 hnsw(faiss) hnsw(nmslib) hnswlib
  67. 67. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. Yu. A. Malkov, A. Ponomarenko, V. Krylov. Approximate nearest neighbor algorithm based on navigable small world graphs. 2014 HNSW (Hierarchical Navigable Small World graphs) Navigable Small World graph (NSW) Hierarchical NSW (HNSW)
  68. 68. https://github.com/erikbern/ann-benchmarks#glove-100-angular SW-graph, HNSW SW-graph(nmslib) hnsw(nmslib)
  69. 69. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 • 노드 밀집도 증가 • 노드간 거리 감소
  70. 70. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 • 각 노드에 연결되는 엣지 최대 개수가 제한됨 > 로그 스케일 복잡도를 보장해줌
  71. 71. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 • 각 노드의 레벨은 Index build 타이밍에 랜덤으로 결정됨 • Layer=0에는 모든 노드가 존재 • 그 중 일부가 상위 레벨에도 존재
  72. 72. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 Level = 2 인 노드 Level = 1, 0 에도 노드가 존재함
  73. 73. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 Level = 1 인 노드 Level = 0 에도 노드가 존재함
  74. 74. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 Enter point • Graph Traverse는 최상위 레이어에 있는 Enter point부터 시작
  75. 75. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 Query Vector 여기서부터 Traverse 시작
  76. 76. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 현재 Layer에서 Query vector와 가장 인접한 노드까지 이동
  77. 77. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 아래 Layer로 이동
  78. 78. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 현재 Layer에서 Query vector와 가장 인접한 노드까지 이동
  79. 79. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 아래 Layer로 이동
  80. 80. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 현재 Layer에서 Query vector와 가장 인접한 노드까지 이동
  81. 81. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 서울 부산 자갈치 시장
  82. 82. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 서울 부산 자갈치 시장
  83. 83. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 서울 부산 자갈치 시장
  84. 84. Yu. A. Malkov, D. A. Yashunin. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. 2016. https://arxiv.org/abs/1603.09320 Layer = 0 Layer = 1 Layer = 2 서울 부산 자갈치 시장
  85. 85. Benchmark - Build time • glove 100D data, 8 thread 기준, n2가 55% 빠름 Indexbuildingtime(seconds) 0 1,250 2,500 3,750 5,000 Index building parameter setting M32,post0 M48,post0 M32,post2 M48,post2 hnsw(n2) hnsw(nmslib)
  86. 86. Index Build Time 최적화 • 코드 리펙토링 • Memory Prefetch
  87. 87. 데이터1만개당insert소요시간(sec) 0.0 4.0 8.0 12.0 16.0 데이터 개수 0 300,000 600,000 900,000 1,200,000 nmslib N2 (프로토 타입) N2 (최적화) 위 차트는 glove 100D 데이터(120만건)로 측정한 결과 Data source: http://vectors.erikbern.com/glove-25-angular.hdf5
  88. 88. Memory Prefetch • CPU에서 사용할 데이터를 메인 메모리에서 캐시 메모리로 미리 올려놓는 방식 https://en.wikipedia.org/wiki/Cache_hierarchy
  89. 89. Memory Prefetch (software prefetching) https://en.wikipedia.org/wiki/Cache_prefetching Prefetching 을 하지 않은 경우 Prefetching 을 한 경우
  90. 90. Benchmark - Search speed Queriespersecond(1/s) 1 10 100 1000 10000 Recall 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 hnsw(n2) hnsw(nmslib) annoy
  91. 91. 성능 요약 • Index build time은 n2 우세 • Search time 은 nmslib 우세 • trade-off 가능한 수준
  92. 92. MMAP 프로세스 1개 띄웠을 때 프로세스 21개 띄웠을 때
  93. 93. 간편한 설치 & 사용 (python) https://github.com/kakao/n2#n2
  94. 94. Go binding https://github.com/kakao/n2/blob/dev/docs/Go_API.rst#go-code-example
  95. 95. 정리: TOROS N2 • https://github.com/kakao/n2 • 장점 • HNSW 알고리즘 지원 • 빠른 Index Build 속도 (nmslib 대비 55% 빠름) • MMAP 지원 • 설치 & 사용 간편 • Python, Go binding • Future work • Search 속도 개선 • Build 할 때 메모리 더블링 이슈 해결 • 항상 k개 결과 보장하도록 개선
  96. 96. 감사합니다!
  • ssuserc6b46d

    Nov. 13, 2020
  • ssuserb6af06

    Jul. 10, 2019
  • kwnaghwancho

    Jul. 9, 2019
  • junhyeonsong

    Jan. 23, 2019

김성진(nick.kim) / kakao corp.(추천팀) 카카오 추천팀에서 개발한 근사 최근접 이웃 라이브러리 TOROS N2를 소개합니다. https://github.com/kakao/n2

Aufrufe

Aufrufe insgesamt

5.832

Auf Slideshare

0

Aus Einbettungen

0

Anzahl der Einbettungen

44

Befehle

Downloads

40

Geteilt

0

Kommentare

0

Likes

4

×