κ·Έλμ, Dockerκ° λλ°?
μ¬λ¬λΆμ΄ μ»΄ν¨ν° νλ‘κ·Έλ¨μ λ§λ€ λ, κ·Έ νλ‘κ·Έλ¨μ΄ λ€λ₯Έ μ»΄ν¨ν°μμλ μ λμκ°μΌ ν΄μ. κ·Έλ°λ° μ¬λ¬λΆμ΄ λ§λ νλ‘κ·Έλ¨μ λ€λ₯Έ μ»΄ν¨ν°μμ μ μλνμ§ μμ μ μμ΄μ. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λμ»€κ° λ±μ₯νμ΄μ!
λ컀λ μ΄ν리μΌμ΄μ μ κ°μννλ 컨ν μ΄λ κΈ°μ μ ν ννμ λλ€. μ΄ κΈ°μ μ μ¬μ©νλ©΄ κ°λ° νκ²½μ μΌκ΄λκ² μ μ§νκ³ , μ΄ν리μΌμ΄μ μ νμ₯νκ³ λ°°ν¬νλ λ° λ§μ μ΄μ μ μ 곡ν©λλ€.
첫째, λ컀λ νκ²½μ μΌκ΄μ±μ 보μ₯ν©λλ€. κ°λ°μκ° λμΌν νκ²½μμ μ΄ν리μΌμ΄μ μ κ°λ°νκ³ ν μ€νΈν μ μλλ‘ λμμ€λλ€. μ΄λ "λ΄ μ»΄ν¨ν°μμλ μ λλλ°"μ κ°μ λ¬Έμ λ₯Ό λ°©μ§νκ³ ν κ° νμ μ λμ± ν¨μ¨μ μΌλ‘ λ§λ€μ΄μ€λλ€.
λμ§Έ, λ컀λ νμ₯μ±μ΄ λ°μ΄λλ©° ν¨μ¨μ μ λλ€. κ° μ΄ν리μΌμ΄μ μ λ 립μ μΈ μ»¨ν μ΄λλ‘ μ€νλκΈ° λλ¬Έμ μλ‘ μν₯μ μ£Όμ§ μμ΅λλ€. μ΄λ μ¬λ¬ μ΄ν리μΌμ΄μ μ λμμ μ€ννκ±°λ νμ₯ν λ λ§€μ° μ μ©ν©λλ€. λν, 리μμ€λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νμ¬ λ λ§μ μ΄ν리μΌμ΄μ μ λμΌν νλμ¨μ΄μμ μ€νν μ μμ΅λλ€.
μ μ§Έ, λ컀λ λ°°ν¬λ₯Ό λ¨μνν©λλ€. μ΄ν리μΌμ΄μ κ³Ό κ·Έ μμ‘΄μ±μ΄ λͺ¨λ 컨ν μ΄λμ ν¬ν¨λμ΄ μκΈ° λλ¬Έμ, λ°°ν¬ νλ‘μΈμ€κ° λ¨μνλ©λλ€. μ΄λ μ΄ν리μΌμ΄μ μ μ½κ² μ΄λνκ³ νμ₯ν μ μκ² ν΄μ€λλ€.
μ’μ건 μκ² λλ°… Dockerλ₯Ό λ.. μ΄λ»κ² μ°λ건λ°?
첫 λ²μ§Έ λ¨κ³λ Dockerfileμ λ§λλ κ²μ λλ€. Dockerfileμ λ§μΉ μ΄ν리μΌμ΄μ μ λ§λ€κΈ° μν μ리 λ μνΌμ κ°μμ. μ¬κΈ°μλ μ΄ν리μΌμ΄μ μ μ€ννκΈ° μν΄ νμν λͺ¨λ κ΅¬μ± μμμ λͺ λ Ήμ΄κ° ν¬ν¨λμ΄ μμ΅λλ€. μλ₯Ό λ€μ΄, μ΄λ€ μΈμ΄λ νλ μμν¬λ₯Ό μ¬μ©νλμ§, νμν νμΌμ μ΄λμ κ°μ Έμ¬μ§ λ±μ΄ λͺ μλμ΄ μμ£ .
λ λ²μ§Έ λ¨κ³λ Dockerfileμ μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό λ§λλ κ²μ λλ€. μ΄λ―Έμ§λ λ§μΉ μ΄ν리μΌμ΄μ μ "μ€λ μ·"μ΄λΌκ³ μκ°νμλ©΄ λ©λλ€. Dockerfileμ μ μλ λͺ λ Ήμ΄λ₯Ό λ°λΌ μ€ννλ©΄μ 컨ν μ΄λλ₯Ό λ§λ€ λ μ¬μ©ν μ μλ ν¨ν€μ§, νμΌ λ° μ€μ λ±μ΄ ν¬ν¨λ©λλ€.
λ§μ§λ§μΌλ‘, μ΄λ―Έμ§λ₯Ό μ¬μ©νμ¬ μ»¨ν μ΄λλ₯Ό μ€νν©λλ€. μ΄κ²μ λ§μΉ μ΄λ―Έμ§λ₯Ό μ€μ λ‘ μ€ν κ°λ₯ν μ΄ν리μΌμ΄μ μΌλ‘ "νμ΄ ν€μΉλ" κ²κ³Ό λΉμ·ν©λλ€. Dockerλ μ΄ μ΄λ―Έμ§λ₯Ό μ¬μ©νμ¬ μ»¨ν μ΄λλ₯Ό λ§λ€κ³ μ€ννλ©°, μ΄λ κ² νλ©΄ μ΄ν리μΌμ΄μ μ΄ νΈμ€νΈ μμ€ν μμ μλ²½νκ² κ²©λ¦¬λ νκ²½μμ μ€νλ©λλ€.
μ 리λ₯Ό μ κΉ ν΄λ³ΌκΉμ?
- Docker File:
Dockerfileμ λ§μΉ μ±μ λ§λ€κΈ° μν μ€κ³λμ κ°μμ. μ΄ νμΌμλ μ°λ¦¬κ° λ§λ€μ΄μΌ νλ μ±μ ꡬλνκΈ° μν΄ νμν λͺ¨λ κ²μ΄ λ΄κ²¨ μμ΄μ. μλ₯Ό λ€μ΄, νμν νμΌλ€μ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ€μΉ, νκ²½ λ³μ μ€μ , μ€ν μ€ν¬λ¦½νΈ λ±μ΄ μ¬κΈ°μ ν¬ν¨λΌμ. - Docker Image:
Dockerfileμ μ¬μ©νμ¬ λ§λ κ²μ΄ Docker μ΄λ―Έμ§μμ. μ΄ μ΄λ―Έμ§ μμλ μ°λ¦¬κ° λ§λ μ±μ μ€ννλ λ° νμν λͺ¨λ κ²μ΄ ν¬ν¨λΌ μμ΄μ. λ§μΉ μ¬μ§μ μ°μ΄λλ κ²μ²λΌ, μ€νλκ³ μλ μ±μ μ€λ μ·μΌλ‘ μ°μ΄μ μ΄λ―Έμ§λ‘ λ§λ λ€κ³ μκ°νλ©΄ λ©λλ€. μ΄ μ΄λ―Έμ§λ λ³κ²½μ΄ λΆκ°λ₯ν μνλ‘ μ μ§λλ©°, μΈμ λ μ§ λμΌν νκ²½μμ μ€νν μ μμ΄μ. - Container:
λ§μ§λ§μΌλ‘, 컨ν μ΄λλ Docker μ΄λ―Έμ§λ₯Ό μ€ννλ 격리λ νκ²½μ΄μμ. μ΄ μ»¨ν μ΄λ μμμ μ°λ¦¬κ° λ§λ μ±μ΄ λμνκ² λ©λλ€. κ°κ°μ 컨ν μ΄λλ κ³ μ ν νμΌ μμ€ν μ κ°μ§κ³ μμ΄μ μλ‘ μν₯μ μ£Όμ§ μκ³ μ€νλ μ μμ΄μ. μ΄λ―Έμ§λ ν΄λμ€(class)μ κ°μ΄ μκ°ν μ μκ³ , κ°κ°μ 컨ν μ΄λλ ν΄λμ€μμ λ§λ€μ΄μ§ κ°λ³ κ°μ²΄(instance)μ²λΌ λ 립μ μΌλ‘ μ€νλ©λλ€.
μ΄λ κ² Dockerλ₯Ό μ¬μ©νλ©΄ μ°λ¦¬λ κ°λ° νκ²½μ μΌκ΄λκ² μ μ§νκ³ , μ±μ μμ½κ² λ°°ν¬νκ³ μ€νν μ μμ΄μ.
μ΄λ‘ μ μμμΌλ, μ€μ νκ²½μμ λ컀λ₯Ό μ¨λ³΄κ³ μΆμ΄.
κ°μ₯ λ¨Όμ ν΄μΌν κ²μ Docker μ€μΉ!
Dockerλ₯Ό μ€μΉν λ‘컬 λλ μλ²μμ Dockerκ° μ λλ‘ μλνλμ§ νμΈν©λλ€. ν°λ―Έλ λλ λͺ
λ Ή ν둬ννΈμμ docker version
λͺ
λ Ήμ΄λ₯Ό μ€ννμ¬ Docker λ²μ λ° μ€μΉ μνλ₯Ό νμΈν μ μμ΄μ.
λ€μμΌλ‘, Docker Hubμ μ μνμ¬ μνλ μ΄λ―Έμ§λ₯Ό μ°Ύμ΅λλ€. μλ₯Ό λ€μ΄, μΈμ΄ λͺ¨λΈμ μ¬μ©νκΈ° μν΄ Hugging Faceμ μ΄λ―Έμ§λ₯Ό μ¬μ©νλ€κ³ κ°μ ν΄λ΄ μλ€.
Docker Hubμμ ν΄λΉ μ΄λ―Έμ§λ₯Ό μ°Ύμ ν, ν°λ―Έλ λλ λͺ
λ Ή ν둬ννΈμμ docker pull huggingface/transformers-pytorch-gpu
λͺ
λ Ήμ΄λ₯Ό μ€ννμ¬ μ΄λ―Έμ§λ₯Ό λ€μ΄λ‘λν©λλ€.
μ΄μ , λ€μ΄λ‘λν μ΄λ―Έμ§κ° μ μλμ§ νμΈνκΈ° μν΄ docker images
λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν©λλ€.
λ§μ§λ§μΌλ‘, μμμ λ€μ΄λ‘λν μ΄λ―Έμ§λ₯Ό μ¬μ©νμ¬ μ»¨ν
μ΄λλ₯Ό λ§λ€μ΄ κ°λ°νκ²½μ μ€μ ν©λλ€. ν°λ―Έλ λλ λͺ
λ Ή ν둬ννΈμμ docker run --name liky --gpus=all -it huggingface/transformers-pytorch-gpu
λͺ
λ Ήμ΄λ₯Ό μ€νν©λλ€. μ΄λ κ² νλ©΄ liky
λΌλ μ΄λ¦μ 컨ν
μ΄λκ° μμ±λκ³ , Hugging Faceμ Transformers λΌμ΄λΈλ¬λ¦¬κ° μ€μΉλ PyTorchλ₯Ό μ¬μ©ν μ μλ GPU μ§μ 컨ν
μ΄λκ° μ€νλ©λλ€. λ§μ½ LLMμ νμ΅νκ±°λ ν λμλ --shm-size 80gb
μ²λΌ 곡μ λ©λͺ¨λ¦¬ μ΅μ
μ μΆκ°ν΄μ£ΌμΈμ.
μ΄μ , μ΄ μ»¨ν μ΄λ μμμ κ°λ°μ μμνλ©΄ λ©λλ€! νμν ν¨ν€μ§λ₯Ό μ€μΉνκ³ μ½λλ₯Ό νΈμ§νλ©° μλ‘μ΄ κΈ°λ₯μ κ°λ°ν μ μμ΅λλ€. Dockerλ₯Ό μ¬μ©νλ©΄ λ‘컬 νκ²½κ³Ό λμΌν νκ²½μμ μΈμ λ μ§ κ°λ°ν μ μμΌλ©°, 컨ν μ΄λλ₯Ό μ€λ¨νκ³ λ€μ μμνμ¬ μμ μ κ³μν μ μμ΄μ.
μ¬λ¬λΆλ€μ΄ Dockerλ₯Ό μ¬μ©ν λ νμν μΆκ°μ μΈ λͺ λ Ήμ΄λ€μ λͺ¨μμ μ 리ν΄λ³΄κ² μ΅λλ€.
- λ컀 μ€νμ€μΈ 컨ν
μ΄λ 리μ€νΈ νμΈ
docker ps
- λ컀 λͺ¨λ 컨ν
μ΄λ 리μ€νΈ νμΈ
docker ps -a
- λ컀 μ μ₯μμμ μ΄λ―Έμ§ λΉκ²¨μ€κΈ°
docker pull huggingface/transformers-pytorch-gpu
- λ컀 컨ν
μ΄λ μ€ννκΈ°
sudo docker run -v <local_path>:<container_path> --gpus='"device=0,1"' -it huggingface/transformers-pytorch-gpu
- λ컀 컨ν
μ΄λ μΌμμ μ§
ctrl+p+q
- λ컀 컨ν
μ΄λ μ’
λ£
exit
- λ컀 λ€μ λ€μ΄κ°κΈ°
docker attach <컨ν μ΄λμ΄λ¦orID>
- λ컀 컨ν
μ΄λ/μ΄λ―Έμ§ μμ
docker rm <컨ν μ΄λID> docker image rm <μ΄λ―Έμ§ID>
- λ컀 μΈλΆ ν¬νΈ μ΄κΈ° → μ°Έκ³ λ§ν¬
- λ컀 κΆν λΆμ¬ → μ°Έκ³ λ§ν¬
- λ컀 μ€νμ€μΈ 컨ν
μ΄λμ λ€νΈμν¬ μ°κ²°
docker network connect <λ€νΈμν¬ μ΄λ¦> <컨ν μ΄λ μ΄λ¦ λλ ID>
- λ컀 μ€νμ€μΈ 컨ν
μ΄λμ μ μ μνκ³ μΈλΆμμ μμ
ν λ
docker exec -it existing-container <λͺ λ Ήμ΄>
- VScode Docker μ°κ²°
sudo usermod -aG docker $USER newgrp docker
μ΄λ κ² μ 리λ λͺ λ Ήμ΄λ€μ Dockerλ₯Ό μ¬μ©νλ λ°μ μ μ©νκ² νμ©λ κ²μ λλ€.
νμν λ μ°Έκ³ νμλ©΄ μ’μ κ² κ°μμ! π³β¨
μ΄λ κ² Dockerμ κ°λ κ³Ό μ¬μ©λ²μ λν΄ μμ보μμ΅λλ€. Dockerλ κ°λ° νκ²½μ μΌκ΄μ±μ μ μ§νκ³ , λ°°ν¬λ₯Ό λ¨μννλ©°, ν¨μ¨μ μΈ λ¦¬μμ€ κ΄λ¦¬λ₯Ό κ°λ₯νκ² νλ λ± λ€μν μ΄μ μ μ 곡ν©λλ€. μ²μμλ μ΄λ €μΈ μ μμ§λ§, μ΅μν΄μ§λ©΄ κ°λ° κ³Όμ μμ ν° λμμ΄ λ κ²μ λλ€. κ³μν΄μ Dockerλ₯Ό νμ©νμ¬ ν¨μ¨μ μΈ κ°λ° νκ²½μ ꡬμΆν΄λ³΄μΈμ!