์๋ฌธ: https://medium.com/@ongxuanhong/mlops-01-data-testing-why-what-and-how-59cd8005637c
ํ
์คํธ ์์ฑ์ ๊ผญ ํด์ผ ํ๋์ง, ๋ฐ์ดํฐ์์ ๋ฌด์์ ํ
์คํธํด์ผ ํ๋์ง, ํจ๊ณผ์ ์ธ ํ
์คํธ ๋ฐฉ๋ฒ๋ก ์ ๋ํด ์ค๋ช
ํ๋ ๊ธ์ ์ฝ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค.
์ ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํ ๊น?
์๋ก์ด ํ์ ์จ๋ณด๋ฉ
ํ๋ก์ ํธ์ ์๋ก์ด ํ์์ด ํฉ๋ฅํ์์ ๋ ์ ์ ํ ํ ์คํธ๊ฐ ์๋ค๋ฉด, ์ฝ๋๋ฅผ ํ ์ค์ฉ ๋๋ฒ๊น ํ๋ฉฐ ๋ณ์์ ์ํ์ ๊ธฐ๋ฅ, ๊ฐ์ด ์ด๋ป๊ฒ ํ ๋น๋๋์ง ํ์ ํด์ผ ํฉ๋๋ค. ๋ง์ฝ ๋จ์ ํ ์คํธ๊ฐ ์กด์ฌํ๋ค๋ฉด ์๋์ ๊ตฌ์กฐ์ ์ธ ๋จ๊ณ๋ก ์ดํดํ ์ ์์์ ๊ฒ์ ๋๋ค.
- PREPARE: ๋ฐ์ดํฐ ์ดํด
- ACTION: ์ฝ๋ ์คํ ๊ณผ์ ํ์
- ASSERT: ์คํ ํ ๊ธฐ๋ ๊ฒฐ๊ณผ ํ์ธ
์ ์ ํ ๋จ์ํ ์คํธ๊ฐ ์๋ค๋ฉด ์๋ก์ด ํ์์ ํ๋ก์ ํธ ๋ฌธ์๋ฅผ 2~3์ฃผ๊ฐ ํ๊ณ ๋ค ํ์ ์์ด ๋จ์ ํ ์คํธ๋ฅผ ์ดํด๋ณด๋ ๊ฒ ๋ง์ผ๋ก๋ ๋ช ์ผ ์์ ํ๋ก์ ํธ์ ์ต์ํด์ง ์ ์์ ๊ฒ์ ๋๋ค.์ฝ๋ ๋ฆฌํฉํฐ๋ง์ฝ๋ ๋ฆฌํฉํฐ๋ง ํ์๋ QA ์ ๋ฌธ๊ฐ๋ค์ด ์์คํ ์ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ดํ. ์๋ํ๋ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ก์ ์ ์์๋ ๋ฒ๊ทธ๋ฅผ ๋งค๋ฒ QA ํ์ด ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ฒํด์ผ ํ ํ์๊ฐ ์์ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ ์ด๊ธฐ์ ํ ์คํธ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ์์ ์์ ์ ์๊ฐ๋ฟ๋ง ์๋๋ผ ํ๊ณผ ์ ์ฒด ํ๋ก์ ํธ์๋ ํฐ ๋์์ด ๋ฉ๋๋ค.์ ๋ขฐํ ์ ์๋ ๊ณ ํ์ง ์ฝ๋์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ธฐ์ ๋ถ์ฑ๊ฐ ๊ณ์ ์์ด๋ฉด, ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๊ฐ ์ด๋ ค์์ง๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด ์์คํ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋๋ค.
Pull Request ๋ฆฌ๋ทฐ ์ ๋จ์ ํ ์คํธ๋ฅผ ๋ฌด์ํ๋ฉด ๊ธฐ์ ๋ถ์ฑ์ ์ ์ํ์ด ์๊ฒจ๋๋ฉฐ, ํ์ด ํ์ ์ ์ถ๊ตฌํ๊ณ ๊ฑด๊ฐํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ ์ ์๋ ๋ฅ๋ ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ํฌํจํ ๋ฐ์ดํฐ ์ ํ ์์คํ ์ ๊ฐ๋ฐํ ๋ ์ฐ๋ฆฌ๋ ํ์ฐ์ ์ผ๋ก MLOps, ์ฆ ๋จธ์ ๋ฌ๋ ์ด์์ ์์ญ๊ณผ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋ฉ๋๋ค. MLOps๋ ๋ณธ์ง์ ์ผ๋ก DataOps, ModelOps, DevOps๊ฐ ์ตํฉ๋ ๊ฐ๋ ์ผ๋ก, DevOps๋ CI/CD(์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ) ํ๋ก์ธ์ค์ ์ํํ๊ณ ์ง์์ ์ธ ์คํ์ ์ง์ํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์์คํ ์ด ํ์ฅ๋จ์ ๋ฐ๋ผ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ๋ํด CI๊ฐ ์ ๊ธฐ์ ์ผ๋ก ํ ์คํธ๋ฅผ ์ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ํํธ์จ์ด๋ฅผ ๋ฐ์ ์ํค๊ณ ๊ฐ์ ํ ์ ์๋ค๋ ์์ ๊ฐ์ ์ป๊ฒ ๋ฉ๋๋ค.์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ์์ฑํ ๊น?์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ์์ฃผ ์ ์ฉ๋๋ ํ ์คํธ ์์ฑ ๋ฐฉ๋ฒ์ FIRST ์์น์ด๋ฉฐ, ์ด๋ ๋น ๋ฅด๊ณ (Fast), ๋ ๋ฆฝ์ ์ด๋ฉฐ(Independent), ๋ฐ๋ณต ๊ฐ๋ฅํ๊ณ (Repeatable), ์์ฒด ๊ฒ์ฆ(Self-Validating)๋๋ฉฐ ์์์ ์ ํ(Timely) ํ ์คํธ๋ฅผ ์๋ฏธํฉ๋๋ค. - ๋น ๋ฅด๊ฒ(Fast): ํ ์คํธ๊ฐ ๋น ๋ฅผ์๋ก ๋ ๋ง์ ํ ์คํธ๋ฅผ ์คํํ ์ ์๋ ์๊ฐ์ด ์๊น๋๋ค. ํ ์คํธ๊ฐ ๋๋ฆฌ๊ฒ ์คํ๋๋ฉด ํ์ ์์ฃผ ์คํํ์ง ์๊ฒ ๋๊ณ , ์ด๋ก ์ธํด ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํด ์ฝ๊ฒ ์์ ํ ๊ธฐํ๋ฅผ ๋์น ์ ์์ต๋๋ค.
- ๋ ๋ฆฝ์ (Independent): ํ ์คํธ๋ ์๋ก ์์กดํ์ง ์์์ผ ํฉ๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ๋ค๋ฅธ ํ ์คํธ ์ผ์ด์ค์ ์์กดํ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์์ด์ผ ํฉ๋๋ค. ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ก ์์กดํ๋ฉด, ์ฒ์ ์คํจํ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ค๋ฅธ ํ ์คํธ ์ผ์ด์ค์๋ ์ค๋ฅ๋ฅผ ์ ๋ฐํด ๋ฌธ์ ์ง๋จ์ด ์ด๋ ค์์ง๋๋ค.
- ๋ฐ๋ณต ๊ฐ๋ฅ(Repeatable): ํ ์คํธ๋ ๋ชจ๋ ํ๊ฒฝ์์ ์คํ๋ ์ ์์ด์ผ ํฉ๋๋ค. ์ฆ, ๋ก์ปฌ ํ๊ฒฝ์์ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ ํ ์คํธ๋ QA๋ ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์คํ๋ ์ ์์ด์ผ ํฉ๋๋ค.
- ์์ฒด ๊ฒ์ฆ(Self-Validating): ํ ์คํธ๋ ์ผ๊ด๋ ์ฑ๊ณต ๋๋ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ผ ํฉ๋๋ค. ์ค๋ ์คํํ๋ฉด ์ฑ๊ณตํ๊ณ ๋ด์ผ์ ์คํจํ๋ ๊ฒฝ์ฐ๋ ์์ด์ผ ํฉ๋๋ค.
- ์์์ ์ (Timely): ๋จ์ ํ ์คํธ๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ๊ตฌํ๋๋ ์์ ์ ์์ฑ๋์ด์ผ ํฉ๋๋ค.
TDD(Test Driven Development, ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ)
ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ดํ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ์์ ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ๋ฅผ ์์ฑํ ํ, ํ ์คํธ๊ฐ ์คํจํ๋์ง ํ์ธํฉ๋๋ค. ์ดํ ํ ์คํธ๊ฐ ์ฑ๊ณตํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํฉ๋๋ค. ํ ์คํธ๊ฐ ์ฌ์ ํ ์ฑ๊ณตํ๋์ง ํ์ธํ๋ฉด์ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ , ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง(code coverage)
๋จ์ํ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ 99-100%๋ก ์ฌ๋ฆฌ๊ธฐ ์ํด ๋ถํ์ํ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค๋, ํ์ํ ๋งํผ๋ง ์ถฉ๋ถํ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ๋ก์ ํธ๊ฐ ์ผ๋ง๋ ํ
์คํธ๋๊ณ ์๋์ง ์ถ์ ํ๋ ๋ฐ ์ ์ฉํ๋ฉฐ, ์ด๋ฅผ ํตํด ํ์ ํ๋ก์ ํธ ๋ด์์ ์์ง ๋จ์ ํ
์คํธ๊ฐ ์์ฑ๋์ง ์์ ์์ญ์ ํ๊ฐํ๊ณ ์๋ณํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋จ์ํ ์ปค๋ฒ๋ฆฌ์ง ์ง์๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํด ๊ฒ์ฆ(assertion)์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ํ
์คํธ๋ฅผ ์์ฑํ๋ ํจ์ ์ ๋น ์ง๊ธฐ ์ฝ์ต๋๋ค. ์๋ํ๋ฉด ๋ชฉ(mock)์ ์ฌ์ฉํ๊ฑฐ๋ ๋จ์ํ ํจ์๋ฅผ ์คํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ง์๋ฅผ ์ฌ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฐ ๋ฐฉ์์ ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํ๊ฑฐ๋ ๊ฒ์ฆํ์ง ์์ผ๋ฏ๋ก ์ฝ๋ ์คํ์๋ง ์๊ฐ์ ์๋นํ๊ฒ ๋ ๋ฟ, ์ค์ ํ
์คํธ๋ ์ ํ ์ด๋ฃจ์ด์ง์ง ์๊ฒ ๋ฉ๋๋ค.
๋ฌด์์ ํ ์คํธํด์ผ ํ ๊น?
๊ธฐ๋ฅ ํ ์คํธ
์ด ํ ์คํธ ๋จ๊ณ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ๊ณผ ์ ์ฌํ๋ฉฐ ๋ฐ์ดํฐ ํ ์คํธ์์๋ ์ฌ์ฉ๋ฉ๋๋ค. ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ, ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ์ํด ๋ค์ ๋ค ๋จ๊ณ๋ฅผ ์งํํฉ๋๋ค:
- Arrange (์ค๋น): ์ฝ๋์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค์
- Act (์คํ): ํ ์คํธํ ํจ์๋ฅผ ์คํ
- Assert (๊ฒ์ฆ): ๋ฐํ๋ ๊ฒฐ๊ณผ์ ๋ํด ๋ ผ๋ฆฌ์ ๊ฒ์ฆ ์ํ
- Cleanup (์ ๋ฆฌ): ํ ์คํธ์ ์ฌ์ฉ๋ ๋ฆฌ์์ค๋ฅผ ํด์
Python์์๋ ๋ค์๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ ์ ์์ต๋๋ค:
- pytest: ํ๋ก์ ํธ์ ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (https://docs.pytest.org/)
- unittest: ํ ์คํธ์ ๋ฐํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ assertion ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. (https://docs.python.org/3/library/unittest.html)
- coverage: ํ๋ก์ ํธ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์ง์๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (https://coverage.readthedocs.io/)
๋น๋ก ์์คํ
์ ๊ธฐ๋ฅ์ ์๋์ง๋ง, ์ฝ๋ ํฌ๋งท ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒํ๋ Lint ํ
์คํธ๋ ์์ต๋๋ค. black์ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ ์ ์๊ณ (https://github.com/psf/black), flake8์ ํตํด ์ฌ์ฉ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ import, ์ ์ธ๋์ง ์์ ๋ณ์๋ช
์ฌ์ฉ, ํจ์ ๊ธธ์ด๊ฐ ํ์ฉ๋ ์ด ์๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ์ฝ๋ ๋ฌธ์ ๋ฅผ ๊ฒฝ๊ณ ํ ์ ์์ต๋๋ค. (https://flake8.pycqa.org/en/latest/)
์์ฃผ ์ฌ์ฉ๋๋ ํ
์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
- fixture: Arrange ๋จ๊ณ์์ ์ฌ์ฉ๋๋ฉฐ, ๋ณดํต ์ค์ , ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ์์, Spark์ ์ฌ์ฉํ ๊ณ์ฐ ํ ์คํธ ์ SparkSession ๋ฑ์ ์ค์ ํฉ๋๋ค. (https://docs.pytest.org/en/6.2.x/fixture.html)
- conftest.py: ์ฌ๋ฌ fixture๋ฅผ ๋ชจ์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ํ๋ฉฐ, ๋ค๋ฅธ ํ ์คํธ ๋ชจ๋์์ ์ ๊ทผํ์ฌ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- parametrize: fixture์ ์ ์ฌํ๊ฒ ํจ์์ ์ธ์๋ฅผ ๊ตฌ์ฑํ๋ ์ค์ ์ ์ค๋นํ๋ ๋ฐ ๋์์ ์ค๋๋ค. (https://docs.pytest.org/en/6.2.x/parametrize.html)
- mock: ํจ์์ ๋์์ด๋ ๋ณ์ ๊ฐ์ ๋ฎ์ด์ฐ๋ฉฐ, ํตํฉ ํ ์คํธ์์ ์ํ๋ ๋ฐํ ๋์์ ๋ชจํนํ ๋ ์ฌ์ฉํฉ๋๋ค. (https://docs.python.org/3/library/unittest.mock.html)
๋ฐ์ดํฐ ํ ์คํธ
์ฝ๋๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง, ๋ฐ์ดํฐ ํ ์คํธ๋ ๊ทธ ์์ธก ๋ถ๊ฐ๋ฅํ ํน์ฑ ๋๋ฌธ์ ๋ ํฐ ๋์ ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ์ด ์ฆ์ ๋ค์ํ ์คํค๋ง ๋ณ๊ฒฝ(์๋ก์ด ์ปฌ๋ผ ์ถ๊ฐ, ๊ธฐ์กด ์ปฌ๋ผ ์ด๋ฆ ๋ณ๊ฒฝ, ์ปฌ๋ผ ์ญ์ ๋ฑ), ๋ฐ์ดํฐ ํ์ ์์ , ํน์ ๋ ์ง์ ๊ฑฐ๋ ๋๋ฝ, ๋ฐ์ดํฐ ์์ ๋ฐ ์ก์ ๋ฑ์ ํฌํจํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ์ฌ๋ฌ ๋จ๊ณ์์ ํ ์คํธ๋ฅผ ์ํํด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์์ ๋ฐ์ดํฐ ํ ์คํธ
- ์ค๊ฐ ๋ฐ ํต์ฌ ๋ฐ์ดํฐ ๋ชจ๋ธ ํ ์คํธ
- ํ
์ด๋ธ ๋ ๋ฒจ์์์ ํ
์คํธ:
- ํ๊ณผ ์ด์ ์, ๋ฐํ๋๋ ์ปฌ๋ผ ์์๊ฐ ์์๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
- ์คํค๋ง๊ฐ ๊ธฐ๋์ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐ์ดํฐ์ ์ ์ ๋(Freshness).
- ์ปฌ๋ผ ๋ ๋ฒจ์์์ ํ
์คํธ:
- ๊ธฐ๋ณธ ํค์ ๊ณ ์ ์ฑ: ์ค๋ณต๋ ํ์ด๋ ํค ๊ฐ์ด ์๋์ง ํ์ธํฉ๋๋ค.
- NULL ๊ฐ์ ์กด์ฌ ์ฌ๋ถ.
- ํ์ฉ๋ ๊ฐ: ๊ฐ์ด ์์ธก๋ ๋ฒ์ ๋ด์ ์๋์ง, ์ฐธ์กฐ ํค๊ฐ ์์ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด: ๊ฐ ์ฒ๋ฆฌ ํจ์์ ํนํ๋ ๋ ผ๋ฆฌ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ํํฐ๋ง๋ ๊ฐ ๋ชฉ๋ก์ด ๋ฐํ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์๋๋ก ํ๊ฑฐ๋, ๊ฐ๊ฒฉ ํ๋๋ ์ฌ์ ์ ์๋ ํํ/์ํ ๋ฒ์ ๋ด์ ์์ด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ์ ACID ํน์ฑ์ ๋ณด์ฅํ๊ณ ๋ช ๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ๋ ๊ฒ๋ง์ผ๋ก ์ถฉ๋ถํ๋ฐ, ์ ์ด๋ฐ ์ผ์ด ์ด์ ์ ์ด๋ฃจ์ด์ง์ง ์์ ์ด์ ๋ ๋น
๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ. ๋น
๋ฐ์ดํฐ ์์คํ
์ ๋ชฉํ๋ ๋น ๋ฅธ ์ ์ฅ๊ณผ ๋น ๋ฅธ ์ฐ์ฐ. Apache Hudi, Apache Iceberg, Delta Lake์ ๊ฐ์ ๋น
๋ฐ์ดํฐ์ฉ RDBMS ์ ์ฌ ์์คํ
๋ค์ด ์์ด ๋น
๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ์ฐ์ฐ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ฉด์๋ ๋ฐ์ดํฐ์ ACID ์์ฑ์ ๊ด๋ฆฌ ๊ฐ๋ฅ. ๋ํ ์ด์ ์ค์๋ ๋ฐ์ดํฐ ๊ณ์ฝ(Data Contract), ์คํค๋ง ์ด์(Schema Ops)๊ณผ ๊ฐ์ ์ฉ์ด๋ฅผ ์ฌ์ฉํด ์๊ธฐ์น ์์ ๋ณํ๋ฅผ ๊ด๋ฆฌํ์ฌ ํ์ ๋ฐ์ดํฐ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํ.
๋๋ถ๋ถ์ DataOps ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ดํฐ ํ
์คํธ ๋๊ตฌ๋ฅผ ๋ด์ฅ
- Dagster: ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋ฏผ์ฒฉํ ํ ์คํธ ์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Airflow๋ฅผ ๋ฅ๊ฐํฉ๋๋ค (https://docs.dagster.io/concepts/testing).
- DBT ํ ์คํธ: ๋ฐ์ดํฐ ๋ถ์์ ๋์ฑ ์ ํํ๊ฒ ๋ง๋ญ๋๋ค (https://docs.getdbt.com/docs/build/tests).
- great_expectations: ๋ฐ์ดํฐ ํ๋กํ์ผ๋ง๊ณผ ๋ฐ์ดํฐ ๊ฒ์ฆ ๊ธฐ๋ฅ์ ํตํด ์ ๋ ฅ ๋ฐ์ดํฐ ํ์ง์ ๋ณด์ฅํฉ๋๋ค (https://docs.greatexpectations.io/docs/).
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ ์คํธ
๋ชจ๋ธ์ ๋ฐ์ดํฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๋ชจ๋ธ ํ๋ จ ๊ณผ์ ์์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ จ ์ธํธ, ๊ฒ์ฆ ์ธํธ, ํ
์คํธ ์ธํธ๋ก ๋๋์ด, ๋ชจ๋ธ์ ์ผ๋ฐํ ๋ฅ๋ ฅ์ ํฅ์์์ผ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ค์ ํ๊ฒฝ์์๋ ์ ํ๋๋ฅผ ์ ์งํ๋๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ฐ์ด ์ง๋๋ฉด์ ์ค์ ๋ฐ์ดํฐ๋ ๋ณํํ ์ ์์ผ๋ฉฐ, ์ด์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค: ๋ฐ์ดํฐ ๋ถํฌ $(P(X))$๊ฐ ๋ณํ๋ ๋ฐ์ดํฐ ๋๋ฆฌํํธ์ ์กฐ๊ฑด๋ถ ๋ถํฌ $(P(Y|X))$๊ฐ ๋ณํ๋ ์ปจ์
๋๋ฆฌํํธ์
๋๋ค.
๋ชจ๋ธ ์ฌํ๋ จ์ ํ์์ฑ์ ํ๋จํ๊ธฐ ์ํด์๋ ์ง์์ ์ผ๋ก ๋ค์ ๋ ๊ฐ์ง ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํต๊ณ์ ํ
์คํธ ์งํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ถํฌ์ ์ถ์ธ๋ฅผ ์ง์์ ์ผ๋ก ๊ด์ฐฐํ๊ณ ๋น๊ตํฉ๋๋ค. ์ถ์ ์งํ๊ฐ ํน์ ์๊ณ๊ฐ ์ดํ๋ก ๋จ์ด์ง๋ฉด MLOps ํ์ด ์๋์ผ๋ก ๋ฐ์ดํฐ ์์ง, ๋ชจ๋ธ ์ฌํ๋ จ, ์ฑ๋ฅ ํ๊ฐ, ๋ชจ๋ธ ๋ฑ๋ก ๋ฐ ํ๋ก๋์
๋ฐฐํฌ์ ๊ฐ์ ์์
์ ์์ํ๊ฒ ๋ฉ๋๋ค. ๋ค์์ ์ด ๋ชฉ์ ์ ์์ฃผ ์ฌ์ฉ๋๋ ํต๊ณ์ ํ
์คํธ ์งํ์
๋๋ค:
- Kullback-Leiber Divergence
- Population Stability Index
- Jenson-Shannon Divergence
- Kolmogorov-Smirnov Test
์ด ๋ชจ๋ํฐ๋ง ์์คํ ์ ์ฒ์๋ถํฐ ์๋์ผ๋ก ์ค์นํ ์ ์์ผ๋ฉฐ, ๋๋ Evidently AI์ ๊ฐ์ ์คํ ์์ค ๋จธ์ ๋ฌ๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฐธ๊ณ ํ ์๋ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ ํ ์คํธ ์งํ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ๊ณ , ๋ฆฌํฌํธ๋ฅผ ์๊ฐํํ๋ฉฐ, Airflow, MLFlow, Metaflow, Grafana์ ๊ฐ์ ML ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋จ๊ณผ ํตํฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๊ธฐ์ ๋ถ์ฑ๋ ์ด๋์์ ๋น๋กฏ๋ ๊น์?
๊ธฐ์ ๋ถ์ฑ๋ ์ฃผ๋ก ์๋ฐํ ๊ธฐํ ์๋ฐ์์ ๋ฐ์ํฉ๋๋ค. ์ด๋ก ์ธํด ํ์ ์ฝ๋ ๋์์ธ์ ๊ธฐ๋ณธ ์์น์ ๋ฌด์ํ๊ณ ํ์์ ์ธ ํ
์คํธ๋ฅผ ์๋ตํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๊ธํ ์ ๊ทผ ๋ฐฉ์์ ๊ฒฐ๊ตญ ์ฝ๋ ๊ฐ๋
์ฑ์ ๋ฐฉํดํ๊ณ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ ์์กด์ฑ์ ์
ํ์์ผ ํฅํ ์์ ๋ฐ ์
๊ทธ๋ ์ด๋๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ํ, ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋น๋ฒํ ๋ณํ๋ ํ๋ก์ ํธ๋ฅผ ์์ ํ ์ฌ์์
ํด์ผ ํ ํ์์ฑ์ ์ด๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฐ๋ฆฌ๋ ์ถ์ ์ผ์ ์ค์๋ฅผ ์ฐ์ ์ํ ์ง, ์๋๋ฉด ํ
์คํธ๋ฅผ ์์ฑํ๊ณ ์ฝ๋ ํ์ง์ ๊ฒํ ํ๋ ๋ฐ ํ์ํ ์๊ฐ์ ํฌ์ํ ์ง ๊ณ ๋ฏผํ๊ฒ ๋ฉ๋๋ค. ์ด๋ก ์ธํด ๊ธฐ์ ๋ถ์ฑ๋ ๊ณ์ ์์ฌ๊ฐ๋๋ค.
์ด๋ฐ ์ํฉ์์ ๋จ์ ํ
์คํธ(unit testing)๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ค๋ซ๋์ ์ฌ์ฉ๋์ด ์จ ๊ฒ์ฆ๋ ๊ธฐ๋ฒ์ด๋ฉฐ, ์ด ๊ธ์์ ์ค๋ช
ํ ์ฅ์ ๋๋ถ์ ๋ฐ์ดํฐ ์ ํ ๊ฐ๋ฐ ์์ญ์ผ๋ก๋ ํ์ฐ๋์์ต๋๋ค. ๊ฐ๋
์ฆ๋ช
(PoC) ๋ชจ๋ธ์ ํ๋ก๋์
์ ๋ฐฐํฌํ๋ ๊ฒ์ ๋จ์ํ ํ๊ต ํ๋ก์ ํธ์์ ์์
ํ ์์ ์ฝ๋๋ ์ฐ๊ตฌ ๋
ผ๋ฌธ์ ์๋ฃํ์ ๋์๋ ๋ฌ๋ฆฌ, ๋งค์ฐ ์ด๋ ค์ด ์ผ์
๋๋ค. ๋ชจ๋ธ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ์์์ผ ๋ฟ, ๊ทธ ์ดํ๋ ๋๊ฐ์ด ์ค์ํฉ๋๋ค. ๋ฐ๋ก ๋ชจ๋ธ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ์ผ์
๋๋ค. ๋ชจ๋ธ ์ฌํ๋ จ ์ฌ๋ถ๋ ๋ฐ์ดํฐ ๋๋ฆฌํํธ(Data Drift)์ ์ปจ์
๋๋ฆฌํํธ(Concept Drift) ๊ด๋ จ ์งํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
๋คํํ๋ ์ค๋๋ ๋ฐ์ดํฐ ์ปค๋ฎค๋ํฐ์์ ํ
์คํธ ์์ฑ์ ์ค์์ฑ์ ๋ํ ๊ด์ฌ์ด ์ปค์ง๊ณ ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๋ฐ์ดํฐ ์ ๋ฌธ๊ฐ๋ค์ ์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ ๋ฌธ์ผ๋ก ํ๋ ์ฌ๋ฌ ํ๋ค์ด ๋ฑ์ฅํ์ฌ Dagster, DBT, great_expectations์ ๊ฐ์ ์ ์ฉํ ๋๊ตฌ๋ค์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ค์ ํ๋ก์ ํธ์ ๋จ์ ํ
์คํธ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ค๋๋ค.