← AI Engineer
인프라 스케일링 · 몽고DB

검색이 먼저 무너진다 — 모델 300만 개를 받아 낸 방법

모델이 2만 개에서 300만 개로 몇 해 만에 150배 늘면서 훑어 찾던 검색이 무너지고 색인 기반으로 갈아탄 이유. 모델 자체와 모델에 관한 것을 다른 저장소에 갈라 둔 구조, 읽기를 어디로 보내고 무엇만 프라이머리에 남기는지의 네 가지 기준, 그리고 파드 자동 확장과 노드 자동 확장을 두 겹으로 쌓은 방식이 구체적으로 나옴. 사용자 1400만 명에서는 1%만 느려도 14만 명이라는 셈이 이 발표의 출발점.

Arek Borucki Hugging Face발표 2026-07-2921분 24초AI Engineer

한줄 코멘트. 일을 묻는 순간에서 넣는 순간으로 옮긴 것이 이 발표의 뼈대다. 이름을 물을 때마다 훑던 것을 넣을 때 미리 쪼개 두는 쪽으로 바꿨다. 그리고 프라이머리는 프라이머리만 할 수 있는 일에 쓴다는 규칙이 그 뒤를 받친다.

1. 2만에서 300만으로

머신러닝 판과 데이터베이스를 맡는다는 사람이 발표한다.

수부터 놓는다. 사용자 1400만 명, 공개 모델 300만 개, 데이터 묶음 100만 개, 조직 5만 곳이다. 포춘 500대 기업의 30% 넘게가 쓴다고 말한다.

늘어난 폭이 문제의 뿌리다. 몇 해 전 2만 개이던 모델이 지금 300만 개 — 150배다. 데이터 묶음도 2022년 1만, 2024년 10만, 한 해가 채 안 되기 전 50만, 지금 100만이다.

큰 모델이 하나 나올 때마다 그 위에 얹은 모델이 수천 개씩 생긴다고 말한다.

2. 검색이 먼저 무너진다

이 모든 것을 담고 색인하고 찾을 수 있게 해야 하는데 마지막이 가장 어렵다고 말한다.

나누는 문장이 또렷하다. 2만 개일 때는 색인이 없어도 아무 물음이나 빠르고 아무도 눈치채지 못한다. 300만 개가 되면 같은 방식이 무너진다.

그리고 셈을 댄다. 검색이 느리면 사람들은 그냥 떠난다. 사용자가 1400만이면 1%만 겪어도 14만 명이다.

그래서 보는 수가 다르다. 가운데 값보다 뒤쪽 값이 훨씬 중요하다며 *P99에 매달린다고 말한다.

3. 담는 자리를 갈라 둔다

담는 자리를 갈라 둔다

무엇을 어디에 두나

문서 저장소모델에 관한 모든 것누가 만들었고 어디에 있나설정·과금·권한
덩어리 저장소모델 자체토크나이저와 딸린 파일카드에 쓰인 것들
모델을 담은 곳과 모델에 관한 것을 담은 곳이 다르다. 갈라 두었기에 설명하는 쪽과 파일 쪽과 계산하는 쪽을 따로따로 늘릴 수 있다고 말한다.

바탕 구조가 이것이다. 문서 저장소에는 모델 자체가 아니라 모델에 관한 모든 것을 담는다 — 누가 만들었고 어디에 있고 설정과 과금과 권한이 어떤지다.

모델 파일과 딸린 것들은 다른 저장소에 둔다.

얻는 것이 분명하다. 설명하는 쪽과 파일 쪽과 계산하는 쪽을 따로따로 늘릴 수 있다.

4. 물을 때 훑지 말고 넣을 때 쪼갠다

물을 때 훑지 말고 넣을 때 쪼갠다

예전물을 때마다 이름을 훑었다
바꾼 뒤넣을 때 이름을 조각으로 쪼갠다
찾을 때쌓아 둔 색인이 바로 집어 온다
일을 묻는 순간에서 넣는 순간으로 옮긴 것이 이 절의 요점이다. 모델이 2만 개일 때는 훑어도 티가 안 나는데 300만 개가 되면 같은 방식이 무너진다고 말한다.

예전 방식을 그대로 밝힌다. 모델 이름을 물을 때마다 무늬로 훑었고, 결과는 인기 점수로 줄 세웠다. 그 점수는 5분마다 다시 셈했고 최근 이레의 내려받기와 좋아요를 봤다.

작을 때는 잘 돌았다. 그런데 훑는 방식은 안 늘어난다. 자료가 급히 커지자 지연이 나기 시작했다.

바꾼 쪽은 이렇다. 이름을 넣는 순간 조각으로 쪼개 배열에 담아 둔다. 그러면 찾을 때 쌓아 둔 색인이 바로 집어 온다.

읽기 쪽도 따로 뒀다. 본래 자료가 든 자리 말고 읽기와 목록만을 위한 사본을 하나 더 둔 것이다.

바꾼 뒤로는 검색창에서 지연 문제가 없다고 말한다.

5. 프라이머리는 프라이머리만 할 일을

검색만 있는 것이 아니라고 말한다. 수백 개의 서비스가 같은 저장소를 두드린다.

일곱 대로 묶은 무리를 쓰고, 쓰는 일은 한 대만 할 수 있으니 그쪽으로 보내고 읽는 일은 여러 대로 흩는다.

읽기를 어디로 보내나

무엇어디로왜
방금 것이 아니어도 되는 물음따라 적는 쪽굳이 한 대에 몰 이유가 없다
크게 훑고 모으고 바꾸는 일따라 적는 쪽무겁다
바뀐 것을 실시간으로 받아 가는 일따라 적는 쪽이것도 가볍지 않다
그때그때 보는 물음과 보고용숨겨 둔 한 대실제 트래픽과 떼어 놓는다

숨겨 둔 한 대는 자료는 계속 받아 오되 평소 요청은 안 받는다. 무거운 물음이 있을 때 거기에 직접 붙는다.

규칙은 한 줄로 정리된다. 프라이머리는 프라이머리만 할 수 있는 일에 쓰고 나머지는 다른 데로 민다.

6. 다음은 쪼개기, 그리고 두 겹 자동 확장

곧 한 무리로는 모자라진다며 다음 걸음으로 *샤딩을 든다. 모두가 전부를 갖는 대신 자료를 조각내 조각마다 다른 무리에 둔다. 조각마다 그 안에서 또 프라이머리와 따라 적는 쪽을 갖는다. 더 늘리고 싶으면 조각을 더 붙이면 되고 나누는 일은 자동으로 맞춰 준다.

무엇을 기준으로 쪼갤지가 만만찮은 일이라고 인정하면서 이 발표에서 다룰 자리는 아니라고 넘긴다.

자동 확장은 두 겹이다.

두 겹

겹무엇이 늘어나나
위몰릴 때 실행 단위가 늘고 빠지면 준다. 열 개에서 오백 개까지
아래그것을 얹을 기계가 모자라면 기계를 더 붙인다

앞으로 위쪽을 다른 방식으로 옮길 계획이라고 말한다. 지금은 CPU와 메모리만 보고 늘리는데, 바꾸면 초당 요청 수 같은 실제 지표로 늘릴 수 있다. 그래서 CPU는 한가한데 줄이 밀려 있는 상태를 지금 방식은 못 보고 새 방식은 본다는 것이다.

닫는 말이 좋다. 이 얼개의 가장 좋은 점은 쓰는 사람이 이것을 생각할 일이 없다는 것이다. 밑이 아무리 복잡해져도 위를 단순하게 지키는 것이 규모를 늘리는 일의 본질이라고 말한다.

7. 발표가 밝히지 않은 것

바꾸기 전과 후를 견준 값이 없다. 훑던 시절이 얼마나 느렸고 지금이 얼마인지가 안 나온다. 매달린다는 그 뒤쪽 값도 실제 수치가 한 번도 안 나온다.

드는 값이 없다. 일곱 대를 굴리고 실행 단위를 오백 개까지 늘리는 데 얼마가 드는지가 없다. 비용 효율이라고 말하면서 견준 자리가 없다.

쪼개기는 아직 안 했다. 다음 걸음이라고만 하고, 무엇을 기준으로 쪼갤지는 이 발표에서 안 다룬다고 넘긴다.

바꾼 뒤 문제가 없었는지 없다. 색인 쪽으로 옮기면서 잃은 것 — 이를테면 어떤 물음이 안 되게 됐는지 — 이 나오지 않는다.

읽기를 흩는 데 따르는 어긋남이 없다. 방금 쓴 것이 아직 안 보이는 경우를 어떻게 다루는지가 「강한 일관성이 필요한 것만 남긴다」로만 나온다.

자막이 사람 이름과 도구 이름을 뭉갠다. 발표자 이름부터 여러 군데 어긋나 있어 정확한 표기는 원문에서 갈린다.

용어

*P99
백 번 중 아흔아홉 번은 이 시간 안에 끝난다는 뜻의 지표. 평균이 아니라 느린 쪽 끝을 본다
*샤딩
자료를 조각내 조각마다 다른 기계 무리에 나눠 담는 것