Spaces:
Running
Running
๐งโโ๏ธ ๊ฐ๋ฐ ๊ณผ์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ (Development Journey)
์ด ๋ฌธ์์์๋ Emotion Diary ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ฒช์๋ ์ฃผ์ ๊ธฐ์ ์ ๋์ ๊ณผ์ ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ณผ์ ์ ์์ธํ ๊ธฐ๋กํฉ๋๋ค.
1. ๋์ฉ๋ AI ๋ชจ๋ธ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต ์๋ฆฝ
- ๋ฌธ์ ์ : 1GB๊ฐ ๋๋ AI ๋ชจ๋ธ ํ์ผ์ Git LFS๋ก ๊ด๋ฆฌํ์ผ๋, Hugging Face Spaces์ 1GB ์ ์ฅ ๊ณต๊ฐ ํ๊ณ(Storage limit reached)์ LFS ํ์ผ-ํฌ์ธํฐ ๋ถ์ผ์น(LFS pointer does not exist) ๋ฑ ๋ฐฐํฌ ๊ณผ์ ์์ ์ง์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- ํด๊ฒฐ ๊ณผ์ : ๋ชจ๋ธ๊ณผ ์ฑ ์ฝ๋์ ์์ ํ ๋ถ๋ฆฌ ์ ๋ต์ ์ฑํํ์ต๋๋ค.
- ๋์ฉ๋ ๋ชจ๋ธ์ Hugging Face Hub์ ๋ณ๋๋ก ์ ๋ก๋ํ์ฌ ๋ฒ์ ๊ด๋ฆฌํฉ๋๋ค.
- GitHub ์ ์ฅ์์์๋ Git LFS ์ถ์ ์ ์์ ํ ์ ๊ฑฐํ๊ณ ์์ ์ฑ ์ฝ๋๋ง ๊ด๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
- GitHub Actions ์ํฌํ๋ก์ฐ(
sync-to-hub.yml)์lfs์ต์ ์false๋ก ์ค์ ํ์ฌ, ๋ฐฐํฌ ์์๋ ์ฑ ์ฝ๋๋ง Spaces๋ก ํธ์ํ๋๋ก ์์ ํ์ต๋๋ค.
- ๊ฒฐ๋ก : Spaces ์ฑ ์คํ ์์ ์์
emotion_engine.py๊ฐ Hub๋ก๋ถํฐ ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ๋๋ก ๊ตฌํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฅ ๊ณต๊ฐ ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๊ณ , ์ฝ๋ ๋ณ๊ฒฝ ์ ๋ชจ๋ธ์ ๋ค์ ์ ๋ก๋ํ ํ์๊ฐ ์๋ ํจ์จ์ ์ธ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ์์ฑํ์ต๋๋ค.
2. CI/CD ํ์ดํ๋ผ์ธ์ ๋ถ์ฐ ํ๊ฒฝ ์ธ์ฆ ๋ฌธ์ ํด๊ฒฐ
- ๋ฌธ์ ์ : ๋ก์ปฌ์์
git push๋ก ํธ๋ฆฌ๊ฑฐ๋ GitHub Actions๊ฐ Hugging Face Spaces์ ์ ๊ทผํ ๋Invalid credentials์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ Spaces์ Secret๊ณผ GitHub Actions์ Secret ์ญํ ์ ๋ํ ํผ๋ ๋๋ฌธ์ด์์ต๋๋ค. - ํด๊ฒฐ ๊ณผ์ : '๋ฐฐํฌ ๋ก๋ด(GitHub Actions)'๊ณผ '๋น๋ ๋ก๋ด(Spaces)'์ ๊ฐ๋
์ผ๋ก ์ญํ ์ ๋ช
ํํ ๋ถ๋ฆฌํ์ฌ ์ ๊ทผํ์ต๋๋ค.
- GitHub Actions Secret (
HF_TOKEN): '๋ฐฐํฌ ๋ก๋ด'์ด Hugging Face ์ ์ฅ์(Repository)์ ์ฝ๋๋ฅผ ํธ์ํ ๋ ํ์ํwrite๊ถํ ํ ํฐ์ ๋ฑ๋กํ์ต๋๋ค. - Hugging Face Spaces Secret (
HF_TOKEN): '๋น๋ ๋ก๋ด'์ด ๋ด๋ถ์ ์ผ๋ก LFS ํ์ผ ์ฒ๋ฆฌ๋ ๋ค๋ฅธ private ์ ์ฅ์์ ์ ๊ทผํ ๋ ํ์ํ ํ ํฐ์ ๋ฑ๋กํ์ต๋๋ค. (์ด ํ๋ก์ ํธ์์๋ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ฉด์ Spaces Secret์ ํ์์ฑ์ ๋ฎ์์ก์ต๋๋ค.)
- GitHub Actions Secret (
- ๊ฒฐ๋ก : ๊ฐ๊ธฐ ๋ค๋ฅธ ์คํ ํ๊ฒฝ์์ ํ์ํ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ์ฌ๋ฐ๋ฅธ ๊ถํ์ ํ ํฐ์ ์ ๊ณตํจ์ผ๋ก์จ CI/CD ํ์ดํ๋ผ์ธ์ ์ธ์ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
3. Flask ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ ์ค๊ณ ๋ฐ ๋ฐํ์ ์ค๋ฅ ๋๋ฒ๊น
- ๋ฌธ์ ์ : ๊ฐ๋ฐ ์ด๊ธฐ, ๋ชจ๋ ๋ก์ง์ด ๋ด๊ธด ๋จ์ผ ํ์ผ ๊ตฌ์กฐ(
app.py)๋ก ์ธํด ์ํ ์ฐธ์กฐ(Circular Import) ๋ฐModuleNotFoundError๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ํ, API๊ฐ ํธ์ถ๋ ๋๋ง๋ค AI ๋ชจ๋ธ์ ๋ก๋ฉํ์ฌ ์๋ต ์๋๊ฐ ๋งค์ฐ ๋๋ ธ์ต๋๋ค. - ํด๊ฒฐ ๊ณผ์ : Flask์ Application Factory ํจํด์ ๋์
ํ์ฌ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ฌ์ค๊ณํ์ต๋๋ค.
src/__init__.py์create_appํจ์๋ฅผ ํตํด ์ฑ์ ๋ชจ๋ ๊ตฌ์ฑ์์(DB, ๋ธ๋ฃจํ๋ฆฐํธ, ์ค์ )๋ฅผ ์กฐ๋ฆฝํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.- ์ฑ์ด ์์๋๋ ์์ (
create_app๋ด๋ถ)์์ AI ๋ชจ๋ธ์ ๋จ ํ ๋ฒ๋ง ๋ก๋ํ์ฌapp๊ฐ์ฒด์ ์ ์ฅ(app.emotion_classifier)ํ์ต๋๋ค.
- ๊ฒฐ๋ก : ๊ฐ API ์์ฒญ์์๋
current_appํ๋ก์๋ฅผ ํตํด ๋ฏธ๋ฆฌ ๋ก๋๋ ๋ชจ๋ธ์ ์ฐธ์กฐํ๊ฒ ํ์ฌ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์๋ต ์๋๋ฅผ ๊ทน๋ํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ์ ์ธ ๋ฐฑ์๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์์ต๋๋ค.
4. ๋ชจ๋ธ ์ฑ๋ฅ ํ๋ฝ ๋ฐ ์ ํ๋ ๊ฐ์ ๊ณผ์
- ๋ฌธ์ ์ : ๊ฐ๋ฐ ๊ณผ์ ์์ ์๋ณธ ํ์ต ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ด ๋ชจ๋ธ์ ์ฌํ์ตํ์, ์ ํ๋๊ฐ ์ด๊ธฐ ๋ชจ๋ธ๋ณด๋ค ํ์ ํ ๋ฎ์์ง๋ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
- ํด๊ฒฐ ๊ณผ์ : ์ฑ๋ฅ์ ๋ณต์ํ๊ณ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ์คํํ์ต๋๋ค.
- ํผ๋ ํ๋ ฌ(Confusion Matrix) ๋ถ์: ๋ชจ๋ธ์ด ์ด๋ค ๊ฐ์ ๋ค์ ์๋ก ํผ๋ํ๋์ง ํ์ ํ์ฌ ๋ฌธ์ ์ ์์ธ์ ์ง๋จํ์ต๋๋ค.
- ๋ ์ด๋ธ ์ฌ๊ตฌ์ฑ (Label Remapping): ์ธ๋ถํ๋ ๊ฐ์ ๋ ์ด๋ธ์ 6๊ฐ ๋๋ 4๊ฐ์ ์ฃผ์ ๊ฐ์ ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๋ถ๋ฅ ๋ฌธ์ ์ ๋ณต์ก๋๋ฅผ ์กฐ์ ํ์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ถ๊ท ํ ํด์: ์์ ํด๋์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฐํ๋ ์ค๋ฒ์ํ๋ง(Oversampling) ๋ฐ ๊ฐ ํด๋์ค์ ๋ค๋ฅธ ์ค์๋๋ฅผ ๋ถ์ฌํ๋ ์๋ ํด๋์ค ๊ฐ์ค์น(Manual Class Weights)๋ฅผ ์ ์ฉํ์ต๋๋ค.
- ์ ์ด ํ์ต(Transfer Learning) ๊ฐํ: ๊ฐ์ฑ ๋ถ์์ ํนํ๋ NSMC(Naver Movie Corpus) ๋ฐ์ดํฐ์ ์ผ๋ก 1์ฐจ ์ฌ์ ํ์ตํ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก, ์ต์ข ๊ฐ์ ๋ฐ์ดํฐ์ 2์ฐจ ๋ฏธ์ธ์กฐ์ (Fine-tuning)์ ์ํํ์ต๋๋ค.
- ๊ฒฐ๋ก : ์ฌ๋ฌ ์คํ ๊ฒฐ๊ณผ, 'ํ๊ตญ์ด ๊ฐ์ฑ๋ํ ๋ง๋ญ์น' ๋ฐ์ดํฐ์ ๋ ์ด๋ธ์ 6๊ฐ์ ์ฃผ์ ๊ฐ์ ์ผ๋ก ๋งคํํ๊ณ , ๋ฐ์ดํฐ ๋ถ๊ท ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋์ผ๋ก ํด๋์ค ๊ฐ์ค์น๋ฅผ ์ ๊ตํ๊ฒ ์กฐ์ ํ์ฌ ํ์ตํ๋ ๋ฐฉ์์ด ์ฝ 80%์ ์ ํ๋๋ฅผ ํ๋ณตํ๋ฉฐ ๊ฐ์ฅ ์์ ์ ์ด๊ณ ํจ๊ณผ์ ์์ ํ์ธํ์ต๋๋ค.