Resident Resource Implementation 56d KO - teamswyg/laya-tools GitHub Wiki

์ƒ์ฃผ ์ž์› ์‹คํ—˜56d ๊ตฌํ˜„๊ณผ ์‹คํ–‰ ๊ฒฝ๊ณ„

English ยท ๋ณด์กด๋œ ์‚ฌ์ „ ์„ค๊ณ„ ยท Go ๊ตฌํ˜„

์ด ๋‹จ๊ณ„๋Š” ์ž‘์€ ํžŒํŠธ ๋„๊ตฌ๋ฅผ ํ•œ ๋ฒˆ ์ผœ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ์š”์ฒญํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. Laya ๋ชจ๋ธ ์ถ”๋ก ยทํ•™์Šต ์‹คํ—˜์€ ์•„๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ณต๊ฐœ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ž์› ์ธก์ •๊ณผ, ์„œ๋กœ ๋‹ค๋ฅธ ์š”์ฒญ์—์„œ ํžŒํŠธ๊ฐ€ ์œ ์šฉํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์˜๋ฏธ ํ‰๊ฐ€๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๊ฒฐ๊ณผ ์ˆ˜์ง‘ ์ „์— ์ž‘์„ฑํ•˜๋Š” ๊ตฌํ˜„ ์„ค๋ช…์ด๋ฉฐ, ์„ฑ๊ณต ์ˆ˜์น˜๋‚˜ CI ์™„๋ฃŒ๋ฅผ ๋ฏธ๋ฆฌ ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฌด์—‡์„ ์‹คํ–‰ํ•˜๋Š”๊ฐ€

๊ธฐ์กด72๊ฐœ ๊ณต๊ฐœ ๋ถ€๋ชจ์˜ ์š”์ฒญ๊ณผ ํ›„๋ณด ์„ค๋ช…๋งŒ ์ถ”์ถœํ•œ๋‹ค. ํ›„๋ณด๊ฐ€ ์›๋ž˜3๊ฐœ์ธ ๋ถ€๋ชจ๋งŒ ์„ ํƒํ•˜๊ณ , ํ…์ŠคํŠธ์˜ ์ •๊ทœํ™” ํŠน์ง•์ด ๊ฐ™์€ ํˆฌ์˜์€ ์ฒซ ์›๋ฌธ์„ ์œ ์ง€ํ•œ๋‹ค. ์›๋ž˜ ๋ถ€๋ชจยทํ›„๋ณด ID์™€ ์„ ํƒ/์ œ์™ธ ์ด์œ ๋Š” ์—ฐ๊ฒฐ ์ž๋ฃŒ๋กœ ๋ณด์กดํ•œ๋‹ค. IDยท์ •๋‹ตยทํ›„๋ณด ์†Œ์Šค๋Š” ์ˆœ์œ„ ํŠน์ง•์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์ง•์ด2๊ฐœ ์ด์ƒ์ธ์ง€๋Š” ์ค€๋น„ ๋‹จ๊ณ„์—์„œ ํ™•์ธํ•œ๋‹ค.

๋ชจ๋“  ์ž…๋ ฅ์€ ์ •ํ™•ํ•œ compact JSON bytes๋ฅผ base64๋กœ ์ €์žฅํ•œ๋‹ค. ๋ณด๊ธฐ ์ข‹๊ฒŒ JSON์„ ๋‹ค์‹œ ์ €์žฅํ•ด๋„ ์‹ค์ œ ์ „์†ก bytes๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ์‹คํ–‰ํ•  ๋•Œ LF ํ•œ ๊ฐœ๋ฅผ ๋ถ™์ด๋ฉฐ LF ํฌํ•จ12KiB ์ œํ•œ์„ ์ ์šฉํ•œ๋‹ค. ์›๋ฌธ wire SHA, ์ž…๋ ฅ digest, ์ •๊ทœํ™” ํŠน์ง• SHA๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ ์˜ ๊ฐ’์ด๋‹ค. ์ •๊ทœํ™”๊ฐ€ ๋ฌธ์žฅ ๋ถ€ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ํŠน์ง• SHA๋Š” ์›๋ฌธ ๋ฌธ๋ฒ•์„ ๋ณด๋Š” narrow_rule์˜ ์•ˆ์ „ํ•œ ์บ์‹œ ํ‚ค๊ฐ€ ์•„๋‹ˆ๋‹ค.

์‹ค์ œ child๋Š” riido-shortclaim --stream์ด๋‹ค. fixed_order, bm25, lexical_ordered, narrow_rule ๋„ค ๊ฐ€์ง€ Go ๊ธฐ์ค€์„ ์€ ๊ฐ ์š”์ฒญ์˜ ์ค€๋น„ยท๊ฒ€์ฆยท์ˆœ์œ„ยทdigestยท์ถœ๋ ฅ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ธฐ๋Œ€ ์‘๋‹ต์€ ์ค€๋น„ ๋‹จ๊ณ„์—์„œ ๊ฐ™์€ ๊ณต๊ฐœ ๊ตฌํ˜„์œผ๋กœ ๋งŒ๋“  ํ”„๋กœํ† ์ฝœ ๋น„๊ต๊ฐ’์ด๋ฉฐ ๋…๋ฆฝ์ ์ธ ์ •๋‹ต ๋ผ๋ฒจ์ด ์•„๋‹ˆ๋‹ค. ํ›„๋ณด๋Š” ํ•ญ์ƒ ๋ชจ๋‘ ๋ณด์กดํ•˜๊ณ  ์‘๋‹ต ์ƒํƒœ๋„ unverified_heuristic์ด๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ „์— ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ

ํ•ญ๋ชฉ ์‹คํ–‰ ์ •์ฑ…
ํ–‰๋ ฌ ๊ธฐ์ค€์„ 4 ร— same/distinct2 ร— ์ƒˆ child3 = 24ํ–‰
ํ–‰์˜ ์š”์ฒญ ์ฒซ ์š”์ฒญ1 + ์˜ˆ์—ด20 + timed1024 = 1045
ํ’€ ์‹œ์ž‘ ์œ„์น˜ ์ฒซ ์š”์ฒญยท์˜ˆ์—ดยทtimed ๊ฐ ๋‹จ๊ณ„์—์„œ ์œ„์น˜0๋ถ€ํ„ฐ ์‹œ์ž‘
์‹คํ–‰ ์ˆœ์„œ ๋ฐ˜๋ณต1ยท3์€ ๊ธฐ์ค€์„  ์ •๋ฐฉํ–ฅ, ๋ฐ˜๋ณต2๋Š” ์—ญ๋ฐฉํ–ฅ; workload ์ˆœ์„œ๋Š” ๊ต๋Œ€
์ œํ•œ child15์ดˆ, replay60์ดˆ, ์ •๋ฆฌ ๊ณตํ†ต ์˜ˆ์‚ฐ1000ms; ์‹คํŒจ ์ฒซ ํ–‰์—์„œ ํ›„์† ํ–‰ ์ค‘๋‹จ
๋™์‹œ ์ฒ˜๋ฆฌ child1, ์ง„ํ–‰ ์ค‘ ์š”์ฒญ1, ์ž๋™ ์žฌ์‹œ๋„0
Go ์„ค์ • Go1.27.1, CGO0, trimpath, GOMAXPROCS1, heap soft limit256MiB
์‹ ๊ทœ ๊ณต๊ฐœ ์ž๋ฃŒ corpusยทplanยทpreparationยทrecipeยทresults JSON ํ•ฉ๊ณ„8MiB ์ด๋‚ด

์ด25,080ํšŒ์™€ timed24,576ํšŒ๋Š” ๋ฐ˜๋ณต ๊ด€์ธก ํšŸ์ˆ˜๋‹ค. ์ƒˆ๋กœ์šด ํ•™์Šต ์š”์ฒญ์ด๋‚˜2400๊ฐœ ์ตœ์ข… ํ‰๊ฐ€๋ฅผ ํ™•๋ณดํ–ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค. ์ƒˆ child๋„ OS ์บ์‹œ๊ฐ€ ๋น„์›Œ์ง„ cold๋ฅผ ๋œปํ•˜์ง€ ์•Š์œผ๋ฉฐ ์บ์‹œ๋ฅผ ๊ฐ•์ œ๋กœ ๋น„์šฐ์ง€ ์•Š๋Š”๋‹ค. CPU P ์ˆ˜์™€ heap soft limit์€ OS ์Šค๋ ˆ๋“œยท์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ•์ œ ์ƒํ•œ์ด ์•„๋‹ˆ๋‹ค.

๋ฐฐํฌํ•  driver์˜ ์‹ค์ œ ์†Œ์Šค22๊ฐœ๋Š” ์ปดํŒŒ์ผ์— ํฌํ•จ๋œ bytes์™€ ์ €์žฅ์†Œ bytes๋ฅผ ๋Œ€์กฐํ•œ๋‹ค. ๋ณ„๋„ child ์†Œ์Šค๋ฅผ ํฌํ•จํ•œ runtime ํŒŒ์ผ24๊ฐœ, module ํŒŒ์ผ2๊ฐœ, ์ˆ˜์ง‘ ์ „ ๊ฒ€์‚ฌ5๊ฐœ๋ฅผ ํ•ฉ์นœ31๊ฐœ๋ฅผ ๊ณ„ํš์— ํ•ด์‹œ๋กœ ๊ณ ์ •ํ•œ๋‹ค. ๋ชฉ๋ก ๋ฐ– ๊ตฌํ˜„ ํŒŒ์ผ๋„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. ๋นŒ๋“œ recipe์™€ ์‹ค์ œ ๋‘ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ SHAยทbuildinfo, ์›๋ณธ ์ž…๋ ฅ SHA, ํ”Œ๋žซํผ๋ณ„ ํ”„๋กœํ† ์ฝœ ๊ธฐ๋Œ€ bytes,24ํ–‰ ์ˆœ์„œ๋ฅผ ๊ณต์‹ ์‹คํ–‰ ์ „์— ๋ด‰์ธํ•œ๋‹ค.

preparation_source_commit์€ CLI์—์„œ40์ž๋ฆฌ ํ˜•์‹๋งŒ ํ™•์ธํ•œ๋‹ค. ๊ทธ commit์˜ Git blob31๊ฐœ๊ฐ€ ๊ณ„ํš์˜ ์†Œ์Šค ํ•ด์‹œ์™€ ๊ฐ™์€์ง€๋Š” ๋ณ„๋„ ๋ด‰์ธ ์ž‘์—…์—์„œ ํ™•์ธํ•˜๊ณ  ๊ธฐ๋กํ•œ๋‹ค. CLI๊ฐ€ Git ์ด๋ ฅ์„ ๊ฒ€์ฆํ–ˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ณ„ํš SHA๋ฅผ ๋”ฐ๋กœ ๋ฐ›์•„ ๊ฒ€์ฆํ•˜๋ฉฐ, ํ•œ ๋ฒˆ ์ฝ์–ด ํ•ด์‹œ๋ฅผ ํ™•์ธํ•œ child bytes๋ฅผ ๋น„๊ณต๊ฐœ ์œ„์น˜์— ๋ณต์‚ฌํ•ด ์‹คํ–‰ํ•œ๋‹ค. ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋น„๊ณต๊ฐœ ๊ฒฝ๋กœ๋Š” Git์— ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

CPUยท๋ฉ”๋ชจ๋ฆฌยท์‹œ๊ฐ„์„ ์ฝ๋Š” ๋ฒ•

Child ์ข…๋ฃŒ ๋’ค user/system CPU์™€ lifetime peak RSS๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. Controller๋Š” ์ž๊ธฐ CPU์˜ replay ๊ตฌ๊ฐ„ ์ฆ๊ฐ€์™€, ์ค€๋น„๋ฅผ ํฌํ•จํ•œ ์ „์ฒด lifetime peak RSS๋ฅผ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•œ๋‹ค. Child๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. Go์˜ ProcessState๋Š” OS๋ณ„ ์ž์› ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, CPU API๋Š” ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค์™€ ๊ทธ ์ž์‹์˜ ์‹œ๊ฐ„์„ ์„ค๋ช…ํ•œ๋‹ค. ์ด๋ฒˆ ๊ด€์ธก ๋ฒ”์œ„๋ฅผ ์ž„์˜์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค ํŠธ๋ฆฌ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Linux RSS ์›๋‹จ์œ„๋Š” getrusage์˜ KiB์ด๋‹ค. Darwin์€ XNU ์ž์› ๊ตฌํ˜„์—์„œ resident_size_max๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•„๋“œ ์ •์˜๋Š” bytes๋‹ค. ์›๋‹จ์œ„์™€ ๋ณ€ํ™˜ bytes๋ฅผ ํ•จ๊ป˜ ๋‚จ๊ธด๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค์˜ peak๋ฅผ ๋”ํ•ด์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•œ ์ด ๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. RSS๋Š” Go heapยทGPU ๋ฉ”๋ชจ๋ฆฌยทํ˜„์žฌ warm ๋ฉ”๋ชจ๋ฆฌ๋„ ์•„๋‹ˆ๋‹ค.

Timed RTT๋Š” ์“ฐ๊ธฐ ์‹œ์ž‘๋ถ€ํ„ฐ ์™„์ „ํ•œ ์‘๋‹ต ์ค„ ์ˆ˜์‹ ๊นŒ์ง€๋‹ค. Controller ๊ฒ€์ฆ ์‹œ๊ฐ„์€ ์ˆ˜์‹ ๋ถ€ํ„ฐ ๊ฒ€์ฆ ์™„๋ฃŒ๊นŒ์ง€๋กœ, ์ „๋‹ฌ ๋Œ€๊ธฐ์™€ ์‹ค์ œ ๊ฒ€์ฆ ์ž‘์—…์„ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•œ๋‹ค. ์ˆœ์ˆ˜ startupยทchild ์ฒ˜๋ฆฌยทpipe ์‹œ๊ฐ„์€ ๊ด€์ธกํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ฐ ํ–‰์˜ ๊ธฐ๋Œ€ stream ํ•ด์‹œ ์ค€๋น„ ์‹œ๊ฐ„์€ child ์‹œ์ž‘ ์ „์ด์ง€๋งŒ ์ „์ฒด replay CPUยท์‹œ๊ฐ„ ์•ˆ์— ํฌํ•จํ•œ๋‹ค. ๊ฒน์น˜๋Š” ์‹œ๊ฐ„์„ ๋นผ๊ฑฐ๋‚˜ ๋”ํ•ด ์ˆจ์€ ๋น„์šฉ์„ ์ถ”์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์™„๋ฃŒ๋œ ํ–‰์˜ CPU/request ๋ถ„๋ชจ๋Š” ์ฒซ ์š”์ฒญ๊ณผ ์˜ˆ์—ด์„ ํฌํ•จํ•œ1045๋‹ค. Timed ์ง€์—ฐ ๋ถ„๋ชจ๋Š”1024๋‹ค. ์‹คํŒจํ•œ ํ–‰์€ ์‹ค์ œ ์‹œ๋„ยท์ „์†กยท์ˆ˜์‹ ยท๊ฒ€์ฆยท์‹คํŒจยท๋ฏธ์™„๋ฃŒยท๋ฏธ์‹œ๋„ ์ˆ˜์™€ ๊ฐ€๋Šฅํ•œ CPU/RSS๋ฅผ ๋ณด์กดํ•˜๋ฉฐ,1045๊ฐœ ์„ฑ๊ณต ํ‰๊ท ์œผ๋กœ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค. ํ›„์† ๋ฏธ์‹œ์ž‘ ํ–‰๋„ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ™•์ธ, stdout/stderr reader, ์ทจ์†Œ watcher๊ฐ€ ํ•œ ๋ฒˆ์˜ ๊ณตํ†ต1000ms ์ •๋ฆฌ ์˜ˆ์‚ฐ์„ ๊ณต์œ ํ•œ๋‹ค. ์ •๋ฆฌ๊ฐ€ ๋Šฆ๊ฑฐ๋‚˜60์ดˆ ๊ฒฝ๊ณ„๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์œ„๋ฐ˜์„ ๋‚จ๊ธฐ๊ณ  ์žฌ์ธก์ •์œผ๋กœ ๋ฎ์ง€ ์•Š๋Š”๋‹ค.

์ค€๋น„์™€ ๊ณต์‹ ์‹คํ–‰์˜ ๊ตฌ๋ถ„

--stage prepare๋Š” ์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— corpus.json, preparation.json, build-recipe.json์„ ๋งŒ๋“ ๋‹ค. Child ์š”์ฒญยท๋ชจ๋ธ ํ˜ธ์ถœยทfitยท๋ณดํ˜ธ๋œ ์ตœ์ข… ์ž๋ฃŒ ์ฝ๊ธฐ๋Š”0์ด๋‹ค. ๋‹จ์œ„ ๊ฒ€์‚ฌ์—์„œ ์“ฐ๋Š” ์ž‘์€ ๊ฐ€์งœ ํ”„๋กœ์„ธ์Šคยท์ž˜๋ชป๋œ ์‘๋‹ตยท์‹œ๊ฐ„ ์ดˆ๊ณผ ์‚ฌ๋ก€์™€ packaged build ๋Œ€์กฐ๋Š” ์ˆ˜์ง‘๊ธฐ ๊ฒ€์ฆ์ด๋ฉฐ ๊ณต์‹ ์„ฑ๋Šฅ ํ–‰๋ ฌ์ด ์•„๋‹ˆ๋‹ค. ์›๋ณธ ์†Œ์Šค ํ•จ์ˆ˜์˜ ์˜๋ฏธ ์ •๋‹ต์„ ์ƒˆ๋กœ ๊ฐ์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ณต์‹ --stage replay๋Š” ๋ด‰์ธ๋œ plan SHAยทcorpusยท์‹ค์ œ packaged child๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ธฐ์กด ์ถœ๋ ฅ์€ ๋ฎ์–ด์“ฐ์ง€ ์•Š์œผ๋ฉฐ, ์ฒซ child ์ „์— ์ƒˆ results ํŒŒ์ผ์„ ํ™•๋ณดํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ ๋ถˆ์ผ์น˜ยทstderrยท์‹œ๊ฐ„ ์ดˆ๊ณผยท์ข…๋ฃŒ ์‹คํŒจ๋Š” ๊ณ ์ • ์˜ค๋ฅ˜ ์ด๋ฆ„์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  ๋น„๊ณต๊ฐœ ์ธ์ž๋‚˜ stderr ์›๋ฌธ์„ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ณผ ์ˆ˜์ง‘ ํ›„์—๋งŒ ์‹ค์ œ ๊ด€์ธกยทCI ๋งํฌ๋ฅผ ๋ณ„๋„ ๊ฒฐ๊ณผ ๋ฌธ์„œ์— ๋ถ™์ธ๋‹ค.

์บ์‹œยทSIMDยทlockยทSoAยทopen-loop ๋™์‹œ์„ฑยทecho ๋Œ€์กฐ๋Š” ์ดํ›„ ๋…๋ฆฝ ๊ณ„ํš์œผ๋กœ ๋‚จ๊ธด๋‹ค. ์˜๋ฏธ ํšจ์šฉ๊ณผ ๋„๋ฉ”์ธ๋ณ„ ์ตœ์†Œ2400๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณดํ˜ธ๋œ ์ตœ์ข… ์š”์ฒญ ๋ชฉํ‘œ๋„ ๋ณ„๋„๋‹ค. ์ด๋ฒˆ ๋‹จ๊ณ„์˜ ํ•™์Šตยท์ƒˆ ๋ชจ๋ธยท๊ฐ€์ค‘์น˜ยท์šด์˜ ์ž๋™ ํ™œ์„ฑํ™”ยทLLM ์ ˆ๊ฐ ์ฃผ์žฅ์€0์ด๋‹ค.