마루옵스서버 · 네트워크 · AI 기술 노트

소개문의

[Python 개발 환경 05] 데이터 처리·AI 환경 설계: pandas·Jupyter·CPU와 GPU

노트북과 스케치북이 놓인 책상

참고 사진 · 노트북과 스케치북이 놓인 책상 · 사진: Sebastian Mantel sebamantel / 원본 / CC0 · 목록용 크기 조정

데이터 처리와 AI를 모두 “파이썬 프로젝트”로 묶을 수는 있지만, 같은 환경에 넣어야 한다는 뜻은 아닙니다. CSV를 정리하는 배치와 GPU 추론 서버는 필요한 패키지·실행 자원·배포 주기가 다를 수 있어요. 환경이 커지는 이유를 보고 경계를 나눠 보겠습니다.

Python 개발 환경 · 01 선택과 venv · 02 uv · 03 conda · 04 웹 개발 · 05 데이터·AI · 06 OCR·서비스 분리

이 글의 목차

작업 종류에 따라 먼저 고를 것

작업출발점추가로 관리할 것
작은 CSV·API 수집 배치uv 또는 venv. Python 패키지 중심으로 단순하게입력 위치·출력 스키마·인코딩·스케줄
과학 계산·네이티브 패키지 조합conda도 비교. 팀의 기존 분석 환경과 채널 기준 고려바이너리 라이브러리·채널·플랫폼
대화형 분석위 환경에 notebook 도구·커널을 추가커널 경로·실행 순서·데이터 버전
GPU 학습·추론GPU 전용 프로젝트 또는 환경드라이버·프레임워크 빌드·GPU 메모리·모델 revision
웹 API와 모델 추론 결합초기엔 한 서비스도 가능. 요구사항이 갈라지면 분리요청 계약·큐·모델 작업자·장애 경계

pandas는 pip와 conda 양쪽 설치 경로가 있습니다. “데이터 작업이라 conda”처럼 도구를 고정하기보다 네이티브 의존성과 팀의 재현 절차를 확인하세요. pandas 공식 설치 문서도 두 방식을 안내합니다.

1. 코드·데이터·노트북을 다른 위치에 둔다

data-demo/
├── pyproject.toml
├── uv.lock
├── .python-version
├── src/data_demo/
│   ├── __init__.py
│   └── summary.py
├── tests/test_summary.py
├── notebooks/
├── data/
│   ├── raw/
│   └── processed/
└── .gitignore

원본 데이터는 raw, 파생 결과는 processed로 나눕니다. 원본을 덮어쓰지 않으면 변환 코드를 바꾼 뒤 다시 처리하기 편합니다. 실제 운영 데이터·개인정보·대형 파일은 코드 저장소 대신 정해 둔 스토리지와 접근 정책으로 관리하고, 작은 테스트용 데이터만 별도 fixture로 남길 수 있습니다.

2. 최소 패키지로 CSV 배치를 만든다

[project]
name = "data-demo"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = ["pandas>=2.2,<4"]

[dependency-groups]
dev = ["pytest>=8,<10", "ruff>=0.11,<1"]
notebook = ["ipykernel>=6,<8"]

[build-system]
requires = ["hatchling>=1.27,<2"]
build-backend = "hatchling.build"

src/data_demo/__init__.py를 빈 파일로 만들고, summary.py에 다음 내용을 저장합니다. 이 예제의 amount는 원 단위 정수이며 소수 금액을 처리하는 일반 회계 모델을 뜻하지 않습니다.

import argparse
from pathlib import Path

import pandas as pd


def summarize(source: Path, destination: Path) -> None:
    frame = pd.read_csv(source, dtype={"category": "string", "amount": "int64"})
    result = frame.groupby("category", as_index=False)["amount"].sum()
    destination.parent.mkdir(parents=True, exist_ok=True)
    result.sort_values("category").to_csv(destination, index=False)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("source", type=Path)
    parser.add_argument("destination", type=Path)
    args = parser.parse_args()
    summarize(args.source, args.destination)

data/raw/sales.csv

category,amount
A,10000
B,7000
A,5000
uv python pin 3.12
uv lock
uv sync --locked
uv run --locked python -m data_demo.summary data/raw/sales.csv data/processed/totals.csv
cat data/processed/totals.csv

결과는 A 15000, B 7000입니다. 입력과 출력 경로를 명령 인자로 받았기 때문에 개발 PC와 배치 서버에서 파일 위치만 바꿔 같은 코드를 실행할 수 있어요. 코드 안에 개인 PC의 절대 경로를 적는 것보다 배포하기 쉽습니다.

tests/test_summary.py

from data_demo.summary import summarize


def test_totals(tmp_path):
    source = tmp_path / "sales.csv"
    output = tmp_path / "totals.csv"
    source.write_text("category,amount\nA,10000\nB,7000\nA,5000\n", encoding="utf-8")
    summarize(source, output)
    assert output.read_text(encoding="utf-8").splitlines() == [
        "category,amount", "A,15000", "B,7000"
    ]
uv run --locked python -m pytest
uv run --locked ruff check src tests

3. 노트북은 같은 환경의 커널을 선택한다

uv run --locked --group notebook python -m ipykernel install --user \
  --name data-demo --display-name "Python (data-demo)"

Jupyter 서버를 다른 도구로 실행해도 커널은 이 환경을 선택할 수 있습니다. 노트북의 첫 셀에서 sys.executable을 확인하고, 재사용할 처리 로직은 src/data_demo로 옮겨 테스트합니다. 셀 실행 순서에만 의존하는 상태가 남으면 “처음부터 다시 실행”할 때 결과가 달라질 수 있어요.

conda를 팀 표준으로 사용한다면 3편의 환경에 같은 처리 코드를 설치·실행할 수 있습니다. 다만 그 프로젝트의 주 관리자를 conda로 정했다면 uv가 같은 환경의 패키지를 임의로 다시 동기화하는 식으로 섞지 않습니다. 누가 어떤 의존성을 관리하는지 하나의 재현 절차로 정합니다.

4. AI 환경에서는 드라이버와 Python 패키지를 구분한다

층확인할 예잠금 파일의 바깥인지
GPU 드라이버nvidia-smi로 드라이버와 장치 확인OS·호스트 관리
프레임워크 빌드PyTorch 버전, CPU/CUDA/ROCm 빌드프로젝트 명세와 선택한 패키지 출처
CUDA 개발 도구커스텀 확장을 빌드할 때 nvcc와 호환성 확인추가 도구 설치·빌드 환경
모델 파일모델 ID, revision·checksum, 라이선스와 저장 위치별도 모델 아티팩트 관리
추론 설정정밀도·배치·컨텍스트·메모리 제한실행 설정과 검증 기록

nvidia-smi의 CUDA 표시는 드라이버가 지원하는 최대 CUDA 버전을 나타내며, 설치된 Toolkit의 버전 목록이 아닙니다. 드라이버, 프레임워크에 포함된 런타임, 소스 빌드에 필요한 Toolkit을 구분해 확인해야 합니다. GPU 드라이버를 venv나 conda가 대신 설치한다고 가정하지 않습니다. NVIDIA 호환성 설명을 참고하세요.

CPU 전용 PyTorch 프로젝트의 구성 예

다음은 앞의 pandas 프로젝트와 별도의 디렉터리에 둘 CPU 전용 명세 예시입니다. 실제 GPU 환경의 패키지 출처는 uv의 PyTorch 구성 안내와 PyTorch 설치 선택기에서 장치·OS·지원 Python에 맞춰 선택합니다.

[project]
name = "ai-cpu-demo"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = ["torch>=2.8,<3"]

[tool.uv.sources]
torch = { index = "pytorch-cpu" }

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
# 위 명세를 저장한 별도의 ai-cpu-config 디렉터리에서
uv python pin 3.12
uv lock
uv sync --locked
uv run --locked python -c 'import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available())'

explicit = true와 tool.uv.sources는 torch를 지정한 CPU 인덱스에서 가져오게 하고, 일반 패키지까지 그 인덱스에서 찾는 상황을 피하도록 구성한 것입니다. GPU용 인덱스를 선택할 때 URL의 CUDA 숫자만 바꿔 무조건 동작한다고 생각하지 마세요. 드라이버와 프레임워크의 지원 조합이 먼저입니다.

이 연재의 실행 검증은 CSV 배치와 CPU 기반 일반 Python·OCR 환경을 대상으로 했습니다. PyTorch 명세는 공식 문서 기반의 구성 예이며, GPU 학습·추론 성능이나 CUDA 장치 동작을 실측한 결과는 제시하지 않습니다.

같은 환경을 유지할 때와 나눌 때

모델을 한 번 호출하는 작은 실험은 하나의 환경으로 시작해도 됩니다. 하지만 API와 학습 코드가 다른 torch 버전을 요구하거나, GPU 작업자만 큰 모델·드라이버 조건을 가진다면 독립 환경이 운영하기 편합니다. 개발 도구 그룹은 같은 프로젝트의 보조 의존성을 나누는 장치이고, 서로 충돌하는 실행 환경을 완전히 분리하는 장치는 아닙니다.

이 기준은 OCR 서비스에도 그대로 이어집니다. 다음 06 OCR·서비스 분리에서는 Python 라이브러리 바깥의 실행 파일과 언어 데이터까지 함께 확인합니다.

연재 예제 파일 내려받기 · venv·conda 명세와 uv·웹·데이터·OCR 예제 소스, 확인한 uv 잠금 파일을 묶었습니다. 각 프로젝트 디렉터리에서 실행하며 OS 패키지는 본문의 절차로 별도 준비합니다.

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

닉네임·이메일·댓글 내용·IP 주소·브라우저 정보는 댓글 게시 및 관리에 사용됩니다. 이메일과 접속 정보는 공개 댓글에 표시하지 않습니다. 개인정보 요청은 운영자 이메일로 보내 주세요. 개인정보처리방침