ML/MLOps Engineer
MLOps 02: Dagster — Seamless Data Pipelines & ML Model Management for Machine Le

MLOps 02: Dagster โ€” Seamless Data Pipelines & ML Model Management for Machine Learning Engineers ๋ฅผ ์ฝ๊ณ  ๋ฒˆ์—ญํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

DataOps์™€ MLOps์˜ ๋™๊ธฐ

๋จธ์‹ ๋Ÿฌ๋‹ ์—”์ง€๋‹ˆ์–ด๋ง ํŒŒ์ดํ”„๋ผ์ธ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ฐ์ดํ„ฐ ์ค€๋น„
  • ๋ชจ๋ธ ํ•™์Šต
  • ๋ชจ๋ธ ์„œ๋น„์Šค ๋ ˆ์ด์–ด

๋ชจ๋ธ์„ ์„œ๋น„์Šคํ•˜๋Š” ์ตœ์ข… ๋‹จ๊ณ„๊นŒ์ง€ ์›ํ™œํ•˜๊ฒŒ ์—”๋“œ ํˆฌ ์—”๋“œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„(DAG), ์Šค์ผ€์ค„๋ง, ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น….
ํ˜„์žฌ ๋‹ค์–‘ํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์˜คํ”ˆ ์†Œ์Šค ์†”๋ฃจ์…˜๋ถ€ํ„ฐ AWS์™€ Microsoft Azure์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์— ๋‚ด์žฅ๋œ ์†”๋ฃจ์…˜๊นŒ์ง€ ํญ๋„“๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋Š” Airflow์ด์ง€๋งŒ, ์ตœ๊ทผ ๋– ์˜ค๋ฅด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ Dagster๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•˜๊ณ  ํ’๋ถ€ํ•œ ์‚ฌ๊ณ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฃผ๋กœ ์ž‘์—…๊ณผ ์šด์˜์— ์ง‘์ค‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๋ชจ๋ธ ์šด์˜๊ณผ ๋ฐ์ดํ„ฐ ์šด์˜์€ ์ข…์ข… ๊ฐ„๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด ํ…Œ์ด๋ธ”์ด๋‚˜ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์ฒ˜๋Ÿผ ๊ด€๋ฆฌ, ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ž์‚ฐ(asset)์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋„์ž…๋˜๋ฉด์„œ, ๋‹จ์ˆœํžˆ ์ž‘์—…๊ณผ ์šด์˜์—๋งŒ ์ง‘์ค‘ํ•˜๋˜ ๊ฒƒ์—์„œ ๋ฐ์ดํ„ฐ์—๋„ ์ดˆ์ ์„ ๋งž์ถœ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Dagster ์ž์‚ฐ ๊ตฌํ˜„


Dagster ์ž์‚ฐ์ด ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์‹œ๋กœ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ์ƒ๋ฅ˜ ์ž์‚ฐ(Upstream 1๊ณผ Upstream 2)๊ณผ ํ•˜๋‚˜์˜ ํ•˜๋ฅ˜ ์ž์‚ฐ(CombineAsset)์ด ์žˆ์Šต๋‹ˆ๋‹ค. Dagster ์ž์‚ฐ์„ importํ•˜๊ณ  @asset ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด, ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์ž์‚ฐ ํ‚ค๊ฐ€ ๋˜์–ด Dagster ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Dagster๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ’๋ถ€ํ•œ ์‹œ๊ฐํ™” ๋ฐ ์ฃผ์„ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ์กด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ์œ ์—ฐํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dagster๋Š” ๊ฒฝ๋Ÿ‰ํ™” ๋˜์–ด ํด๋ผ์šฐ๋“œ ๋„คํŠธ์›Œํฌ์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ๋ฐ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Dagster ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ™œ๋ฐœํ•˜๊ฒŒ ๋ณ€ํ™”ํ•˜๋ฉฐ ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ง€์†์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ธฐ์ˆ  ์Šคํƒ๊ณผ Dagster ํ†ตํ•ฉ

Dagster๋Š” MLflow, Airflow ๋˜๋Š” DVC์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•œ ๊ธฐ์กด ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„, Dagster๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ  ๋‚ด์—์„œ ์ž์‚ฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

pip install dagster dagit

์ž์‚ฐ ๊ตฌํ˜„

from dagster import materialize  
if __name__ == "__main__":  
  result = materialize(assets=[my_first_asset])

Dagster๋ฅผ ํ™œ์šฉํ•œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ

Dagster์˜ ์ฃผ์š” ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” IOManager ๊ฐœ๋…์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ํ˜•(API, SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ)์— ๋Œ€ํ•ด ๋‹จ์ผ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์จ, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ „๋ฐ˜์—์„œ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํšจ์œจ์ ์ธ ๋ชจ๋ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด, Dagster์™€ ํ•จ๊ป˜ ํŒŒ์ผ ๊ธฐ๋ฐ˜, Git ๊ธฐ๋ฐ˜, ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ๋Š”, ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•ด ๋ชจ๋ธ ๋ฒ„์ „์„ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ Dagster ํ”Œ๋žซํผ ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฐ€์‹œ์„ฑ ์ง€์›


Dagster๋Š” ๋ชจ๋ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์‹œ๊ฐํ™”๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋‘๊ณ  ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ์‹œ๊ฐํ™”ํ•จ์œผ๋กœ์จ, ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ ์ตœ์ ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Dagster๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , ์„ฑ๋Šฅ์ด ํ•ด๋‹น ์ž„๊ณ„๊ฐ’ ์•„๋ž˜๋กœ ๋–จ์–ด์งˆ ๋•Œ ๋ชจ๋ธ์„ ์ž๋™์œผ๋กœ ์žฌํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ๋ณ„ ํ’ˆ์งˆ ๋ณด์žฅ ๋ฐ ๋ฐฐํฌ

Dagster๋Š” ๋กœ์ปฌ๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ์„ค์ •์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ๊ณ„ ์ „ํ™˜ ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ๊ณผ์ • ์ „๋ฐ˜์—์„œ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

๊ฒฐ๋ก ์ ์œผ๋กœ, Dagster๋Š” DataOps ๋ฐ MLOps ๊ตฌํ˜„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ ๊ฐœ์„ 
  • ๊ธฐ์กด ๊ธฐ์ˆ  ์Šคํƒ๊ณผ์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ
  • ์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ์ž์‚ฐ ์ž๋™ ์‹๋ณ„
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ IO ๋งค๋‹ˆ์ €
  • ํ–ฅ์ƒ๋œ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์„ ์œ„ํ•œ ์‰ฌ์šด ๋””๋ฒ„๊น… ๋ฐ ํ…Œ์ŠคํŠธ
  • ๋กœ์ปฌ๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ํšจ์œจ์ ์ธ ๋ฐฐํฌ

๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ์˜ ์šฉ์ด์„ฑ์„ ๊ฐ–์ถ˜ Dagster๋Š” ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ์šด์˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.