Path Scaling 33 KO - teamswyg/laya-tools GitHub Wiki

์‹ค์ œ ํŒŒ์ผ ํ›„๋ณด ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ

์ˆ˜์ง‘ ์ค‘ ์ฝ์„ ์ˆ˜ ์žˆ๋˜ 264๊ฐœ ๋ชฉ๋ก ์ค‘ 102๊ฐœ๊ฐ€ ๊ธฐ์กด 4,096๊ฐœ ํ›„๋ณด ํ•œ๋„๋ฅผ ๋„˜์—ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋ชฉ๋ก์€ 6,924๊ฐœ ํŒŒ์ผ์ด์—ˆ๋‹ค. ์ด๋Š” ์ค‘๊ฐ„ ๊ด€์ธก์ด๋ฉฐ ์ „์ฒด 2,400๊ฐœ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ž‘์€ ์ €์žฅ์†Œ๋งŒ ๊ณจ๋ผ ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ์ž˜๋ผ๋‚ด์ง€ ์•Š๋„๋ก ํ™•์žฅ ๊ณ„ํš์„ ๋จผ์ € ๊ณ ์ •ํ–ˆ๋‹ค.

์„ ํƒ์  Go API

hintsearch.NewPathIndex(paths)๋Š” ๊ณ ์œ ํ•œ ์ƒ๋Œ€ ํŒŒ์ผ ๊ฒฝ๋กœ ์ตœ๋Œ€ 100,000๊ฐœ, ๊ฒฝ๋กœ๋‹น 4,096๋ฐ”์ดํŠธ, ํ•ฉ๊ณ„ 16MiB๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ˆ˜์ง‘๊ธฐ์˜ ์ƒํ•œ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋นˆ ๊ฒฝ๋กœยท์ค‘๋ณตยท์ž˜๋ชป๋œ UTF-8ยท๊ฒฝ๋กœ ์ •๊ทœํ™” ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜๋กœ ๋Œ๋ ค์ค€๋‹ค. ์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ํŒŒ์ผ์ด๋‚˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์—ด์ง€ ์•Š๋Š”๋‹ค. ์ ‘๊ทผ ๊ถŒํ•œ๊ณผ ์›์ฒœ ๋ชฉ๋ก์˜ ์™„์ „์„ฑ์€ ํ˜ธ์ถœ์ž๊ฐ€ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.

idx, err := hintsearch.NewPathIndex(paths)
if err != nil { return err }
ranking, err := idx.RankLongInto(completeRequest, hintsearch.Ranking{})
if err != nil { return err }
order, err := hintsearch.InterleavePathBaselineFirst(ranking.Order, hintIDs)
if err != nil { return err }
// order๋Š” ์›๋ž˜ paths์˜ ์œ„์น˜์ด๋ฉฐ ๋ชจ๋“  ํ›„๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.

์ „์ฒด ๋ชฉ๋ก์—์„œ ๊ณตํ†ต BM25 ํ†ต๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค. ์กฐ๊ฐ๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ์–ต์ง€๋กœ ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ถˆ๋ณ€์ด๋ฉฐ ์–ดํœ˜ยทpostingยท์ ์ˆ˜ยท์ˆœ์„œ๋Š” ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃฌ๋‹ค. ๊ฒฐ๊ณผ ๋ฒ„ํผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๋™์‹œ ํ˜ธ์ถœ์—์„œ๋Š” ๊ฐ๊ฐ ์†Œ์œ ํ•œ๋‹ค. ํฐ ํ›„๋ณด์šฉ ๋ณ‘ํ•ฉ๋„ ๊ธฐ์กด๊ณผ ๊ฐ™์€ baseline-first ์ˆœ์„œ์ด๋ฉฐ, ํžŒํŠธ๊ฐ€ ํ‹€๋ ค๋„ ํ›„๋ณด๋ฅผ ์—†์• ์ง€ ์•Š๋Š”๋‹ค. ์ •ํ™•ํ•˜๊ณ  ๋น„์šฉ์ด ๊ฐ™์€ ํ™•์ธ์„ ๊ฐ€์ •ํ•  ๋•Œ ๊ธฐ์กด ์ˆœ์œ„ r์˜ ํ›„๋ณด๋Š” min(n, 2rโˆ’1)๋ฒˆ ์•ˆ์— ๋‚˜์˜จ๋‹ค. ์‹œ๊ฐ„ยทํ† ํฐยท๋ณต์ˆ˜ ์ฆ๊ฑฐ ์™„์„ฑ์˜ ๋ณด์žฅ์€ ์•„๋‹ˆ๋‹ค.

๊ธฐ์กด New์™€ ๋ณ‘ํ•ฉ API์˜ ์ž‘์€ ํ•œ๋„๋Š” ์œ ์ง€ํ•œ๋‹ค. ๋ชจ๋ธยทํŠน์ง•ยทCLIยท์„ธ์…˜ยท์ง€์—ฐ ํžŒํŠธ์˜ ๊ณ„์•ฝ์€ ๋ฐ”๊พธ์ง€ ์•Š์•˜๋‹ค. ์ด API๋Š” ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ ๊ธฐ์ค€์„ ๊ณผ ํ›„๋ณด ์ˆœ์„œ ์ œ์•ˆ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์ฝ”๋“œ ๋ณธ๋ฌธ ์˜๋ฏธ๋‚˜ ์ž‘์—… ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์„ ์ž…์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฒ€์ฆ๊ณผ ํ”„๋กœํŒŒ์ผ

6,000๊ฐœ ํ›„๋ณด์˜ ๋์— ์žˆ๋Š” ๊ฒ€์ƒ‰์–ด๋ฅผ ์ฐพ๊ณ  ์ „์ฒด ๋ชฉ๋ก ๊ธฐ์ค€ IDF๋ฅผ ๋…๋ฆฝ ๊ณ„์‚ฐํ•ด ๋น„๊ตํ–ˆ๋‹ค. ์ตœ๋Œ€ 100,000๊ฐœ ์ž…๋ ฅ์—์„œ๋„ ๋งˆ์ง€๋ง‰ ํ›„๋ณด ๊ฒ€์ƒ‰์„ ํ™•์ธํ•œ๋‹ค. ์ž‘์€ ๋ชฉ๋ก์€ ๊ธฐ์กด ์ ์ˆ˜ยท์ˆœ์„œ์— ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ์—ญ์ˆœ ํžŒํŠธ๋กœ๋„ ๋ชจ๋“  ํ›„๋ณด์™€ baseline ์ˆœ์œ„ ์ƒํ•œ์ด ์œ ์ง€๋˜๋Š”์ง€, ์ž˜๋ชป๋œ ๊ฒฝ๋กœยท์ค‘๋ณตยทํฌ๊ธฐ ์ดˆ๊ณผ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

M4 Pro CPU, ์ž์ฒด ํ•ฉ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ 10,000๊ฐœ, ๋‹จ์–ด ํ•˜๋‚˜๋ฅผ ๋ฐ˜๋ณต ๊ฒ€์ƒ‰ํ•˜๋Š” benchmark๋ฅผ ๊ฐ 3ํšŒ ์‹คํ–‰ํ–ˆ๋‹ค. CPU/ํ• ๋‹น ํ”„๋กœํŒŒ์ผ์€ ๋กœ์ปฌ์—๋งŒ ๋ณด๊ด€ํ–ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ์—์„œ ์ •๋ ฌ ๋น„๊ตยท๊ตํ™˜ ๋น„์šฉ์„ ํ™•์ธํ•˜๊ณ  ๊ฒฐ๊ณผ ์ˆœ์„œ ์ •๋ ฌ์„ sort.Slice์—์„œ slices.SortFunc๋กœ ๋ฐ”๊ฟจ๋‹ค. ์ ์ˆ˜ ๊ณ„์‚ฐ์€ ๊ทธ๋Œ€๋กœ๋‹ค.

์ธก์ • ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
์žฌ์‚ฌ์šฉ ๊ฒ€์ƒ‰ ns/op ๋ฒ”์œ„ 43,054โ€“43,559 35,039โ€“35,084
์žฌ์‚ฌ์šฉ ๊ฒ€์ƒ‰ ํ• ๋‹น B/op 72 16
์žฌ์‚ฌ์šฉ ๊ฒ€์ƒ‰ ํ• ๋‹น ํšŸ์ˆ˜ 3 1

์ด ์กฐ๊ฑด์—์„œ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ์•ฝ 19% ์ค„์—ˆ๋‹ค. ๋‘ ์ธก์ • ๋ชจ๋‘ ๋™์ผํ•œ profiling ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ „์ฒด ์‹œ์Šคํ…œ ๋ถ€ํ•˜์™€ ์‹คํ–‰ ์ˆœ์„œ ํšจ๊ณผ๋ฅผ ๋ฐฐ์ œํ•œ ์ธ๊ณผ ์‹คํ—˜์€ ์•„๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ๋‹จ์–ด ํ•œ ๊ฐœ ๊ฒ€์ƒ‰์„ ์‹ค์ œ ์žฅ๋ฌธยท์ €์žฅ์†ŒยทLLM ์„ฑ๋Šฅ์œผ๋กœ ํ™•๋Œ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ธ๋ฑ์Šค ์ƒ์„ฑ์€ ๋ณ€๊ฒฝ ์ „ ์•ฝ 5.33โ€“5.84ms, ๋ณ€๊ฒฝ ํ›„ ์•ฝ 5.01โ€“5.08ms์˜€์œผ๋ฉฐ ์•ฝ 9.47MB ๋ˆ„์  ํ• ๋‹น๊ณผ 10,113ํšŒ ํ• ๋‹น์ด ์œ ์ง€๋๋‹ค. ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ •๋ ฌ ๋ณ€๊ฒฝ์˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ƒ์„ฑ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ๊ฐœ์„  ํšจ๊ณผ๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ˆ„์  ํ• ๋‹น์€ ์ƒ์ฃผ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋‹ค๋ฅด๋‹ค. SIMD๋‚˜ GPU ๊ฐ€์† ์ฃผ์žฅ์€ ์—†๋‹ค. ์ „์ฒด ์ž๋ฃŒ ์ˆ˜์ง‘์€ ์™„๋ฃŒํ–ˆ์œผ๋ฉฐ ์‹ค์ œ ํŒŒ์ผ ์ •๋‹ต ๋น„๊ต๋Š” ํ›„์† ํ‰๊ฐ€์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.