๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ณต๋ถ€๊ธฐ๋ก/๊นƒ & ๋ฆฌ๋ˆ…์Šค

uv๋กœ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๊ธฐ

by kaizen_bh 2025. 10. 25.

 

 

๋„ค์ด๋ฒ„ ๋ถ€์บ ์—์„œ ๋ฆฌ๋ทฐ ๊ฐ์„ฑ ๋ถ„๋ฅ˜ ์ฑŒ๋ฆฐ์ง€๋ฅผ ํ•˜๋Š”๋ฐ venv ๋Œ€์‹  uv๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ๋” ๋น ๋ฅด๊ณ  ์ข‹๋‹ค๊ณ  ํ•ด์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์จ๋ณด๋ คํ•œ๋‹ค

์…‹ํŒ…ํ•˜๋А๋ผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„๋“ค์ด ์ƒ๊ธฐ๊ธฐ๋„ ํ•ด์„œ ๊ทธ๋ƒฅ ์…‹ํŒ… ๊ณผ์ •์„ ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ๋‚˜์ค‘์— ์ฐธ๊ณ ํ•˜๋ ค ๋„์ ์ด๊ธฐ

์•„๋ž˜๋Š” ์ฐธ๊ณ  ์ž๋ฃŒ๋“ค

 

 

๐Ÿ’ป ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์ž‘์„ฑํ•œ UV ์™„๋ฒฝ ๊ฐ€์ด๋“œ

 

๐Ÿ’ป ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์ž‘์„ฑํ•œ UV ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” UV์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ์‹ค๋ฌด ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

velog.io

 

PIP๋ฅผ ๋Œ€์ฒดํ•˜๋Š” UV ์‚ฌ์šฉ๋ฒ• ๊ฐ€์ด๋“œ

 

PIP๋ฅผ ๋Œ€์ฒดํ•˜๋Š” UV ์‚ฌ์šฉ๋ฒ• ๊ฐ€์ด๋“œ

 

devocean.sk.com

 

 

 

 

 

 


 

 

Text Classification ๋Œ€ํšŒ uv ์…‹์—…

 

 

 

 

 

๋„์ปค ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ์„œ๋ฒ„์— uv๋กœ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๋ ค ํ•œ๋‹ค

 

 

uv ์„ค์น˜ ์ „์— ์„œ๋ฒ„๋Š” ์™„์ „ ๊นกํ†ต์ด๋‹ˆ๊นŒ... ์„ค์น˜ ๋ช…๋ น์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” curl ๋จผ์ € ์„ค์น˜ํ•ด์ฃผ๊ธฐ

apt update
apt install curl -y

 

 

 

 

uv ์„ค์น˜

curl -LsSf https://astral.sh/uv/install.sh | sh

 

root@instance-16554:~/project: curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.9.5 x86_64-unknown-linux-gnu
no checksums to verify
installing to /data/ephemeral/home/.local/bin
  uv
  uvx
everything's installed!

To add $HOME/.local/bin to your PATH, either restart your shell or run:

    source $HOME/.local/bin/env (sh, bash, zsh)
    source $HOME/.local/bin/env.fish (fish)

 

 

 

 

ํŒจ์Šค ์„ค์ • ํ•ด์ฃผ๋ฉด ์„ค์น˜ ์™„๋ฃŒ

๋งค๋ฒˆ ํŒจ์Šค๋ฅผ ๋จผ์ € ์žก์•„์ค˜์•ผ uv ๋ช…๋ น์–ด๊ฐ€ ์ œ๋Œ€๋กœ ์ธ์‹๋˜๋Š”๋ฐ ์•„๋ž˜์ฒ˜๋Ÿผ bashrc์— ์ €์žฅํ•ด๋‘๋ฉด ์„œ๋ฒ„ ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜์–ด ๋งค๋ฒˆ ๋‹ค์‹œ ํŒจ์Šค๋ฅผ ์žก์•„์ค„ ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค

# bash๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
echo 'export PATH=/data/ephemeral/home/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
root@instance-16554:~/project: export PATH=/data/ephemeral/home/.local/bin:$PATH
root@instance-16554:~/project: which uv
/data/ephemeral/home/.local/bin/uv
root@instance-16554:~/project: uv --version
uv 0.9.5

 

 

ํŒŒ์ด์ฌ 3.10 ๋ฒ„์ ผ ์„ค์น˜

root@instance-16554:~/project: uv python install 3.10
Installed Python 3.10.19 in 9.60s
 + cpython-3.10.19-linux-x86_64-gnu (python3.10)

 

 

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” project ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค

root@instance-16554:~/project: uv init
Initialized project `project`

 

 

uv init์œผ๋กœ๋Š” ์ด๋Ÿฐ ์ดˆ๊ธฐํ™” ์ž‘์—…๋งŒ ํ•ด์ฃผ์ง€ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค

 

 

๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ

root@instance-16554:~/project: uv venv -p 3.10 .py310
Using CPython 3.10.19
Creating virtual environment at: .py310
Activate with: source .py310/bin/activate

root@instance-16554:~/project: uv sync
Using CPython 3.10.19
Creating virtual environment at: .venv
Resolved 1 package in 14ms
Audited in 0.00ms

 

uv venv๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ํŒŒ์ด์ฌ ๋ฒ„์ „์˜ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑํ•œ๋‹ค

 

 

๊ทธ๋ฆฌ๊ณ  requirements.txt๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ

uv pip install -r requirements.txt

 

 

 

 

 

uv sync

 

 

์ž‘์—… ํšจ๊ณผ

  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์ •์˜๋œ ํŒจํ‚ค์ง€ ์ž ๊ธˆ ํŒŒ์ผ(uv.lock) ๊ธฐ์ค€์œผ๋กœ venv๋ฅผ ๋™๊ธฐํ™”
  • uv.lock์— ์—†๋Š” ํŒจํ‚ค์ง€๋Š” ์‚ญ์ œ, ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ์„ค์น˜/์—…๋ฐ์ดํŠธ
  • ์ฆ‰, ํ™˜๊ฒฝ์„ ์„ ์–ธ์  ์ƒํƒœ๋กœ ์œ ์ง€

์žฅ์ 

  1. ์žฌํ˜„ ๊ฐ€๋Šฅ ํ™˜๊ฒฝ : ๋‹ค๋ฅธ ๋จธ์‹ ์—์„œ๋„ uv.lock๋งŒ ์žˆ์œผ๋ฉด ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  2. ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์ œ๊ฑฐ : ๊ฐœ๋ฐœ ๋„์ค‘ ์„ค์น˜ํ–ˆ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€ ์‚ญ์ œ ๊ฐ€๋Šฅ
  3. ํŒ€ ๋‹จ์œ„ ํ˜‘์—… : uv.lock์„ ๊ณต์œ  → ํŒ€์›์ด ๋™์ผํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  4. ๊ฐ„ํŽธํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ/๋ณต๊ตฌ : ํ™˜๊ฒฝ ๊ผฌ์˜€์„ ๋•Œ uv sync๋กœ ํ•œ ๋ฒˆ์— ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ

 

 

์˜ค... ํ™•์‹คํžˆ ํŽธํ•ด๋ณด์ธ๋‹ค. ๊ด€๋ฆฌ๋งŒ ์ž˜ ํ•ด๋‘๋ฉด ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€์„œ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ๋น ๋ฅด๊ฒŒ ์…‹ํŒ…์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค

์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ์ ์ธ ํˆด๋“ค ์„ค์น˜ํ•˜๊ณ  ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์ด๋ž‘ ipykernel ๋“ฑ ์„ค์น˜ํ•ด์„œ ์ž‘์—… ํ™˜๊ฒฝ๊นŒ์ง€.

์ฑŒ๋ฆฐ์ง€ ํ•˜๋‹ค๋ณด๋‹ˆ ์„œ๋ฒ„๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ข…๋ฃŒ๋˜๊ณ  ํŒ…๊ธฐ๋Š” ์ด์Šˆ๋“ค์ด ์ข…์ข… ๋ฐœ์ƒํ•ด์„œ ์ƒˆ๋กœ ์…‹ํŒ…ํ•ด์•ผํ•  ์ผ์ด ์ž์ฃผ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ GPT์˜ ๋„์›€์„ ๋ฐ›์•„ ํ•œ๋ฒˆ์— ์…‹์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ, ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค

 

 

  • ์™„์ „ ์ž๋™ํ™”: ๋นˆ ์„œ๋ฒ„์—์„œ setup.sh์™€ requirements.txt๋งŒ์œผ๋กœ ํ™˜๊ฒฝ์„ ์„ธํŒ… ๊ฐ€๋Šฅ.
  • uv ๊ธฐ๋ฐ˜: pip๊ฐ€ ์•„๋‹ˆ๋ผ uv๋ฅผ ์ด์šฉํ•ด ๊ฐ€์ƒํ™˜๊ฒฝ(.venv)๊ณผ ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ๊ด€๋ฆฌ.
  • Python 3.10 ๊ณ ์ •: ์ง€์ •ํ•œ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ(/opt/conda/bin/python3.10) ์‚ฌ์šฉ.
  • Jupyter ํ˜ธํ™˜: ipykernel ์„ค์น˜ ๋ฐ ์ปค๋„ ๋“ฑ๋ก์œผ๋กœ ๋…ธํŠธ๋ถ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
  • VSCode ์ง€์›: .vscode/settings.json ์ƒ์„ฑ, ๊ฐ€์ƒํ™˜๊ฒฝ ์—ฐ๊ฒฐ ๋ฐ lint ํ™œ์„ฑํ™”.
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดˆ๊ธฐํ™”: src, notebooks, data ํด๋”์™€ ๊ธฐ๋ณธ ํŒŒ์ผ ์ƒ์„ฑ.

 

 

 

#!/bin/bash
# =========================================
# /data/ephemeral uv project setup script (uv-only, Python 3.10)
# Python 3.10, uv venv (.venv), Jupyter kernel, VSCode
# =========================================

set -e

# 1. Set project paths
PROJECT_DIR="/data/ephemeral/home/my_project"
UV_BIN="/data/ephemeral/home/.local/bin/uv"
PYTHON_ENV_NAME="py310"
REQUIREMENTS_FILE="/data/ephemeral/home/requirements.txt"
PYTHON_INTERPRETER="/opt/conda/bin/python3.10"

echo "Step 1: Creating and initializing project folder: $PROJECT_DIR"
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR"
rm -rf * .??*   # Remove existing content (irreversible)

# 2. Add uv to PATH
export PATH="$UV_BIN:$PATH"

# 3. Initialize uv project
echo "Step 2: Initializing uv project"
$UV_BIN init

# 4. Create uv virtual environment in default .venv using Python 3.10
echo "Step 3: Creating uv venv in .venv with Python 3.10"
$UV_BIN venv --python "$PYTHON_INTERPRETER"

# 5. Install packages from requirements.txt using uv add
if [ -f "$REQUIREMENTS_FILE" ]; then
    echo "Step 4: Installing packages from $REQUIREMENTS_FILE via uv add"
    $UV_BIN add -r "$REQUIREMENTS_FILE"
else
    echo "Step 4: No requirements.txt found, skipping package installation"
fi

# 6. Install ipykernel via uv add
echo "Step 5: Installing ipykernel via uv add"
$UV_BIN add ipykernel

# 7. Sync uv environment
echo "Step 6: Syncing uv environment"
$UV_BIN sync

# 8. Register Jupyter kernel
echo "Step 7: Registering Jupyter kernel"
source .venv/bin/activate
python -m ipykernel install --user --name $PYTHON_ENV_NAME --display-name "Python ($PYTHON_ENV_NAME)"

# 9. Create project structure
echo "Step 8: Creating project structure"
mkdir -p src notebooks data
touch src/main.py

# 10. VSCode settings
echo "Step 9: Creating VSCode settings"
mkdir -p .vscode
cat > .vscode/settings.json <<EOL
{
    "python.defaultInterpreterPath": "\${workspaceFolder}/.venv/bin/python",
    "python.terminal.activateEnvironment": true,
    "python.linting.enabled": true
}
EOL

echo "Setup complete!"
echo "Project location: $PROJECT_DIR"
echo "Virtual environment: $PROJECT_DIR/.venv"
echo "Python version: $(.venv/bin/python --version)"
echo "Jupyter kernel name: $PYTHON_ENV_NAME"
echo "Requirements installed from: $REQUIREMENTS_FILE"
echo "Ready to use in VSCode"

 

 

์ œ๋Œ€๋กœ ์…‹ํŒ…์ด ๋˜์—ˆ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋“ฑ๋กํ•œ ์ฃผํ”ผํ„ฐ ์ปค๋„์ด ๋‚˜์˜จ๋‹ค

๊ทธ๋ฆฌ๊ณ  requirements.txt์— ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค๋„ importํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค

 

 

 

โœ… ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. setup.sh์™€ requirements.txt๋ฅผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‘๊ธฐ

2. ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰:

bash setup.sh

 

 

3. ์™„๋ฃŒ ํ›„ VSCode์—์„œ .venv/bin/python์„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ์ง€์ •

 

 

 

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค

์—ฌ๊ธฐ์— ๋”ฐ๋กœ ๋นผ๋‘์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋ž‘ ์ฝ”๋“œ๋“ค ๋‹ค์‹œ ์—…๋กœ๋“œํ•˜๋ฉด ์…‹ํŒ… ๋!

requirements.txt ๊ฒฝ๋กœ ์ œ๋Œ€๋กœ ์„ค์ •์•ˆํ•ด์„œ ๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ณ  ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ ์ปค๋„ ๋“ฑ๋ก๊นŒ์ง€ ์ œ๋Œ€๋กœ ๋˜์—ˆ๋Š”๋ฐ๋„ uv add๊ฐ€ ์•ˆ๋˜์„œ ๊ฐ€์ƒํ™˜๊ฒฝ์— ๋””ํ”ผ์…˜์‹œ ๋ฐ˜์˜์ด ์•ˆ๋˜๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ๋งŽ์ด ํ—ค๋ฉ”๋А๋ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ธฐ๊นŒ์ง€ 4์‹œ๊ฐ„์ด๋‚˜ ๊ฑธ๋ ค๋ฒ„๋ ธ๋‹ค...

๊ทธ๋ž˜๋„ ํ™•์‹คํžˆ pip install -r requirements.txt pip ์„ค์น˜๋ณด๋‹ค๋Š” ์†๋„๊ฐ€ ๋งŽ์ด ๋น ๋ฅธ๊ฒŒ ์ฒด๊ฐ์ด ๋˜์—ˆ๋‹ค

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

์•„๋ž˜๋Š” ๊นกํ†ต ์„œ๋ฒ„์—์„œ setup.sh๋ž‘ requirements.txt ๋‘ ๊ฐœ ํŒŒ์ผ๋งŒ ๋„ฃ๊ณ  ์Šคํฌ๋ฆฝํŠธ ํ•˜๋‚˜ ๋”ธ๊น์œผ๋กœ ์…‹ํŒ…ํ•˜๋Š” ์‰˜์Šคํฌ๋ฆฝํŠธ์ด๋‹ค

๋‹ค์Œ์— ๋˜ ์„œ๋ฒ„ ํ„ฐ์ง€๋ฉด ์จ๋ณด๊ณ  ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ด์•ผ๊ฒ ๋‹ค

 

#!/bin/bash
# =========================================
# Complete server setup with uv (Python 3.10)
# Requires: root
# =========================================

set -e

# --------------------------
# 0. Basic server setup
# --------------------------
echo "Step 0: Updating apt and installing curl"
apt update
apt install -y curl

# --------------------------
# 1. Install uv
# --------------------------
echo "Step 1: Installing uv"
curl -LsSf https://astral.sh/uv/install.sh | sh

# Add uv to PATH automatically for future sessions
echo 'export PATH=/data/ephemeral/home/.local/bin:$PATH' >> ~/.bashrc
export PATH=/data/ephemeral/home/.local/bin:$PATH

# --------------------------
# 2. Project paths
# --------------------------
PROJECT_DIR="/data/ephemeral/home/my_project"
PYTHON_ENV_NAME="py310"
REQUIREMENTS_FILE="/data/ephemeral/home/requirements.txt"
PYTHON_INTERPRETER="/opt/conda/bin/python3.10"

echo "Step 2: Creating and initializing project folder: $PROJECT_DIR"
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR"
rm -rf * .??*   # Remove existing content

# --------------------------
# 3. Initialize uv project
# --------------------------
echo "Step 3: Initializing uv project"
uv init

# --------------------------
# 4. Create uv virtual environment
# --------------------------
echo "Step 4: Creating uv venv in .venv with Python 3.10"
uv venv --python "$PYTHON_INTERPRETER"

# --------------------------
# 5. Install packages from requirements.txt
# --------------------------
if [ -f "$REQUIREMENTS_FILE" ]; then
    echo "Step 5: Installing packages from $REQUIREMENTS_FILE via uv add"
    uv add -r "$REQUIREMENTS_FILE"
else
    echo "Step 5: No requirements.txt found, skipping package installation"
fi

# --------------------------
# 6. Install ipykernel
# --------------------------
echo "Step 6: Installing ipykernel via uv add"
uv add ipykernel

# --------------------------
# 7. Sync uv environment
# --------------------------
echo "Step 7: Syncing uv environment"
uv sync

# --------------------------
# 8. Register Jupyter kernel
# --------------------------
echo "Step 8: Registering Jupyter kernel"
source .venv/bin/activate
python -m ipykernel install --user --name $PYTHON_ENV_NAME --display-name "Python ($PYTHON_ENV_NAME)"

# --------------------------
# 9. Create project structure
# --------------------------
echo "Step 9: Creating project structure"
mkdir -p src notebooks data
touch src/main.py

# --------------------------
# 10. VSCode settings
# --------------------------
echo "Step 10: Creating VSCode settings"
mkdir -p .vscode
cat > .vscode/settings.json <<EOL
{
    "python.defaultInterpreterPath": "\${workspaceFolder}/.venv/bin/python",
    "python.terminal.activateEnvironment": true,
    "python.linting.enabled": true
}
EOL

# --------------------------
# 11. Finish
# --------------------------
echo "Setup complete!"
echo "Project location: $PROJECT_DIR"
echo "Virtual environment: $PROJECT_DIR/.venv"
echo "Python version: $(.venv/bin/python --version)"
echo "Jupyter kernel name: $PYTHON_ENV_NAME"
echo "Requirements installed from: $REQUIREMENTS_FILE"
echo "Ready to use in VSCode"

 

 

 

 

 

 

 

Object Detection ๋Œ€ํšŒ ์„œ๋ฒ„ ์…‹์—…

 

 

 

 

uv๋กœ ๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ณ  ๋ถ€์บ ์ธก์ด ๊ณต์œ ํ•ด์ค€ ๋ฒ ์ด์Šค๋ผ์ธ์„ ์…‹์—…ํ•˜๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ ์ด์Šˆ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค

์—๋Ÿฌ๋Š” ๋”ฐ๋กœ ์ ์ง„ ์•Š์•˜์ง€๋งŒ ์„œ๋ฒ„ ๊ธฐ๋ณธ ๋ฉ”๋‰ด์–ผ์—์„œ ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ํŒŒ์ด์ฌ ๋ฒ„์ „์„ 3.11์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ MMDetection์„ ์‚ฌ์šฉํ•˜๋ ค ํ•  ๊ฒฝ์šฐ 3.8์ด์ƒ 3.11๋ฏธ๋งŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„์ „ ์ด์Šˆ๋„ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค

๊ทธ๋ž˜์„œ ๊ฐ€์ƒํ™˜๊ฒฝ ํŒŒ์ด์ฌ ๋ฒ„์ „์€ 3.10์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค

 

๊ทธ ๋’ค์—๋„ ๊ฐ™์ด ๋“ค์–ด์žˆ๋Š” setup.py๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์…‹ํŒ…ํ•œ ๋’ค์— ๋ฒ ์ด์Šค๋ผ์ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๋ณด๋ฉด ์•„๋ž˜์˜ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค

์‹ค์ œ ๋ฒ ์ด์Šค๋ผ์ธ ์ฝ”๋“œ ๋Œ€์‹  ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ด๋„ ๋™์ผ

 

from mmdet.utils import register_all_modules
register_all_modules(init_default_scope=True)

>> ModuleNotFoundError: No module named 'mmcv._ext'
๋”๋ณด๊ธฐ
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[2], line 11
      9 # config file ๋“ค๊ณ ์˜ค๊ธฐ
     10 cfg = Config.fromfile("configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py")
---> 11 register_all_modules(init_default_scope=True)
     12 cfg.default_scope = "mmdet"
     14 # dataset config ์ˆ˜์ •

File ~/baseline/mmdetection/mmdet/utils/setup_env.py:97, in register_all_modules(init_default_scope)
     86 def register_all_modules(init_default_scope: bool = True) -> None:
     87     """Register all modules in mmdet into the registries.
     88 
     89     Args:
   (...)
     95             Defaults to True.
     96     """  # noqa
---> 97     import mmdet.datasets  # noqa: F401,F403
     98     import mmdet.engine  # noqa: F401,F403
     99     import mmdet.evaluation  # noqa: F401,F403

File ~/baseline/mmdetection/mmdet/datasets/__init__.py:31
     26 from .reid_dataset import ReIDDataset
     27 from .samplers import (AspectRatioBatchSampler, ClassAwareSampler,
     28                        CustomSampleSizeSampler, GroupMultiSourceSampler,
     29                        MultiSourceSampler, TrackAspectRatioBatchSampler,
     30                        TrackImgSampler)
---> 31 from .utils import get_loading_pipeline
     32 from .v3det import V3DetDataset
     33 from .voc import VOCDataset

File ~/baseline/mmdetection/mmdet/datasets/utils.py:5
      1 # Copyright (c) OpenMMLab. All rights reserved.
      3 from mmcv.transforms import LoadImageFromFile
----> 5 from mmdet.datasets.transforms import LoadAnnotations, LoadPanopticAnnotations
      6 from mmdet.registry import TRANSFORMS
      9 def get_loading_pipeline(pipeline):

File ~/baseline/mmdetection/mmdet/datasets/transforms/__init__.py:6
      2 from .augment_wrappers import AutoAugment, RandAugment
      3 from .colorspace import (AutoContrast, Brightness, Color, ColorTransform,
      4                          Contrast, Equalize, Invert, Posterize, Sharpness,
      5                          Solarize, SolarizeAdd)
----> 6 from .formatting import (ImageToTensor, PackDetInputs, PackReIDInputs,
      7                          PackTrackInputs, ToTensor, Transpose)
      8 from .frame_sampling import BaseFrameSample, UniformRefFrameSample
      9 from .geometric import (GeomTransform, Rotate, ShearX, ShearY, TranslateX,
     10                         TranslateY)

File ~/baseline/mmdetection/mmdet/datasets/transforms/formatting.py:11
      9 from mmdet.registry import TRANSFORMS
     10 from mmdet.structures import DetDataSample, ReIDDataSample, TrackDataSample
---> 11 from mmdet.structures.bbox import BaseBoxes
     14 @TRANSFORMS.register_module()
     15 class PackDetInputs(BaseTransform):
     16     """Pack the inputs data for the detection / semantic segmentation /
     17     panoptic segmentation.
     18 
   (...)
     42             'scale_factor', 'flip', 'flip_direction')``
     43     """

File ~/baseline/mmdetection/mmdet/structures/bbox/__init__.py:2
      1 # Copyright (c) OpenMMLab. All rights reserved.
----> 2 from .base_boxes import BaseBoxes
      3 from .bbox_overlaps import bbox_overlaps
      4 from .box_type import (autocast_box_type, convert_box_type, get_box_type,
      5                        register_box, register_box_converter)

File ~/baseline/mmdetection/mmdet/structures/bbox/base_boxes.py:9
      6 import torch
      7 from torch import BoolTensor, Tensor
----> 9 from mmdet.structures.mask.structures import BitmapMasks, PolygonMasks
     11 T = TypeVar('T')
     12 DeviceType = Union[str, torch.device]

File ~/baseline/mmdetection/mmdet/structures/mask/__init__.py:3
      1 # Copyright (c) OpenMMLab. All rights reserved.
      2 from .mask_target import mask_target
----> 3 from .structures import (BaseInstanceMasks, BitmapMasks, PolygonMasks,
      4                          bitmap_to_polygon, polygon_to_bitmap)
      5 from .utils import encode_mask_results, mask2bbox, split_combined_polys
      7 __all__ = [
      8     'split_combined_polys', 'mask_target', 'BaseInstanceMasks', 'BitmapMasks',
      9     'PolygonMasks', 'encode_mask_results', 'mask2bbox', 'polygon_to_bitmap',
     10     'bitmap_to_polygon'
     11 ]

File ~/baseline/mmdetection/mmdet/structures/mask/structures.py:12
     10 import shapely.geometry as geometry
     11 import torch
---> 12 from mmcv.ops.roi_align import roi_align
     14 T = TypeVar('T')
     17 class BaseInstanceMasks(metaclass=ABCMeta):

File ~/baseline/.venv/lib/python3.10/site-packages/mmcv/ops/__init__.py:3
      1 # Copyright (c) OpenMMLab. All rights reserved.
      2 from mmcv.utils import IS_MLU_AVAILABLE
----> 3 from .active_rotated_filter import active_rotated_filter
      4 from .assign_score_withk import assign_score_withk
      5 from .ball_query import ball_query

File ~/baseline/.venv/lib/python3.10/site-packages/mmcv/ops/active_rotated_filter.py:10
      6 from torch.autograd.function import once_differentiable
      8 from ..utils import ext_loader
---> 10 ext_module = ext_loader.load_ext(
     11     '_ext',
     12     ['active_rotated_filter_forward', 'active_rotated_filter_backward'])
     15 class ActiveRotatedFilterFunction(Function):
     16     """Encoding the orientation information and generating orientation-
     17     sensitive features.
     18 
     19     The details are described in the paper `Align Deep Features for Oriented
     20     Object Detection  <https://arxiv.org/abs/2008.09397>_`.
     21     """

File ~/baseline/.venv/lib/python3.10/site-packages/mmcv/utils/ext_loader.py:13, in load_ext(name, funcs)
     12 def load_ext(name, funcs):
---> 13     ext = importlib.import_module('mmcv.' + name)
     14     for fun in funcs:
     15         assert hasattr(ext, fun), f'{fun} miss in module {name}'

File ~/.local/share/uv/python/cpython-3.10.19-linux-x86_64-gnu/lib/python3.10/importlib/__init__.py:126, in import_module(name, package)
    124             break
    125         level += 1
--> 126 return _bootstrap._gcd_import(name[level:], package, level)

ModuleNotFoundError: No module named 'mmcv._ext'

ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์˜ ์ฟ ๋‹ค, torch ๋“ฑ์˜ ๋ฒ„์ ผ๊ณผ ์„ค์น˜ํ•˜๋ ค๋Š” MMDetection์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „๋“ค์ด ์•ˆ๋งž์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ

 

 

uv ๊ฐ€์ƒํ™˜๊ฒฝ ์…‹์—…

# ํ”„๋กœ์ ํŠธ ์œ„์น˜์—์„œ ์‹คํ–‰
uv venv --python 3.10
uv pip install -r requirements.txt
uv pip install pip

# ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” +pip ์ตœ์‹ ํ™”
source .venv/bin/activate
pip install -U pip

# ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์— ๊ฐ€์ƒํ™˜๊ฒฝ ์ปค๋„ ๋“ฑ๋ก
uv pip install ipykernel
python -m ipykernel install --user --name baseline --display-name "Python (baseline)"

 

 

PyTorch 2.1.0 + cu121 ์„ค์น˜

pip install torch==2.1.0 --index-url https://download.pytorch.org/whl/cu121

 

์ •์ƒ ์„ค์น˜์‹œ ๋ฒ„์ ผ

import torch
print("torch:", torch.__version__)
print("cuda :", torch.version.cuda)

>>
torch: 2.1.0+cu121
cuda : 12.1

 

 

torchvision ์„ค์น˜ (torch 2.1.0๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฒ„์ „)

pip install torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu121
import torchvision
print("vision:", torchvision.__version__)

 

 

openmim, MMEngine ์„ค์น˜

pip install -U openmim
mim install mmengine

 

 

MMCV 2.1.0 cu121 + torch2.1 wheel ์„ค์น˜

โš ๏ธ ์ ˆ๋Œ€ pip install mmcv ํ•˜๋ฉด ์•ˆ ๋จ
โš ๏ธ ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ _ext CUDA ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ wheel์ด ์„ค์น˜๋จ

pip install "mmcv==2.1.0" -f https://download.openmmlab.com/mmcv/dist/cu121/torch2.1/index.html

 

 

MMDetection ์„ค์น˜

mim install "mmdet==3.3.0"

 

 

์ตœ์ข…์ฒดํฌ

import mmcv, os, glob
mmcv_dir = os.path.dirname(mmcv.__file__)
print("ext:", glob.glob(os.path.join(mmcv_dir, "_ext*")))

>>
ext: ['/data/ephemeral/home/baseline/.venv/lib/python3.10/site-packages/mmcv/_ext.cpython-310-x86_64-linux-gnu.so']
  • _ext ๋ชจ๋“ˆ์ด ์ •์ƒ์ ์œผ๋กœ ์œ„์น˜ํ•œ ๊ฒƒ ํ™•์ธ

 

from mmdet.utils import register_all_modules
register_all_modules(init_default_scope=True)
print("MMDetection OK")

>>
MMDetection OK
  • ๋ชจ๋“ˆ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋„ ํ™•์ธ ์™„๋ฃŒ
  • ํ•™์Šต๋„ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘