Ray ็็ฏๅขไพๅบๆไปถ โ ๅบไบ UV + NAS + Hardlink ็ AOT ้ขๆๅปบ่ๆ็ฏๅข็ฎก็ๆๅก
Environment Fabric ไธๆฏ Ray ็ๆฟไปฃๅ๏ผ่ๆฏ Ray ็ใ็ฏๅขไพๅบๆไปถใใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็ณป็ปๆถๆๅฎไฝ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Environment Fabric โ API โ Execution Engine โ โ
โ โ โโโโโโโโโโโโโโโโโโโโ โ โโโโโโโบ โ โโโโโโโโโโโโโโโโโโโ โ โ
โ โ โข AOT ้ขๆๅปบ็ฏๅข โ โ โข Ray โ โ
โ โ โข NAS ๅ
ฑไบซๅญๅจ + Hardlink โ ่พๅบ โ โข Celery โ โ
โ โ โข pyproject.toml + uv.lockโ ่ทฏๅพ โ โข Kubernetes Job โ โ
โ โ โข ็ฏๅข็ๅฝๅจๆ็ฎก็ โ โ โข Docker / subprocess โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ไบงๅบ๏ผๆ ๅ็ .venv ่ทฏๅพ๏ผๅฆ /mnt/nas/envs/wf-001/node-A/.venv/bin/python๏ผ โ
โ ๆถ่ดน่
๏ผไปปไฝ่ฝไฝฟ็จ Python ่งฃ้ๅจ่ทฏๅพ็ๆง่กๅผๆ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๅฉ็จ Ray ็ py_executable ๅๆฐ๏ผๅฎ้ชๆงๅ่ฝ๏ผ๏ผๅฏไปฅ่ฎฉ Ray Worker ็ดๆฅไฝฟ็จ Environment Fabric ้ขๆๅปบ็ Python ็ฏๅข๏ผ
import ray
# 1. Environment Fabric ้ขๅ
ๆๅปบ็็ฏๅข่ทฏๅพ๏ผไฝไบ NAS ๅ
ฑไบซๅญๅจ๏ผ
# ๆๆ Ray Worker ่็น้่ฟ NFS ๆ่ฝฝๅไธ่ทฏๅพ
PREBUILT_PYTHON = "/mnt/nas/envs/workflow-001/node-A/.venv/bin/python"
# 2. ๅฎไน runtime_env๏ผๅ่ฏ Ray๏ผ"ๅซ่ชๅทฑ่ฃ
ๅ
ไบ๏ผ็ดๆฅ็จๆ็ปไฝ ็่ฟไธช Python"
runtime_env = {
"py_executable": PREBUILT_PYTHON, # ๅ
ณ้ฎ๏ผๆๅฎ Worker ๅฏๅจๆถไฝฟ็จ็่งฃ้ๅจ
"working_dir": "./my_project_code" # ไปๅฏๆ่ฝฝไปฃ็ ็ฎๅฝ
}
@ray.remote(runtime_env=runtime_env)
def heavy_computing_task():
import sys
import torch
# ่ฟ้ไฝฟ็จ็ๆฏ Environment Fabric ้ขๆๅปบ็็ฏๅข
return f"Running on {sys.executable} with torch {torch.__version__}"
# 3. ๆง่ก
ray.init()
print(ray.get(heavy_computing_task.remote()))Tip
่ๅๆถๆ็ๆ ธๅฟๆๆณ
- Environment Fabric๏ผ่ด่ดฃ AOT ้ขๆๅปบ็ฏๅข๏ผไบงๅบ
.venv่ทฏๅพ - Ray๏ผ่ด่ดฃ JIT ไปปๅก่ฐๅบฆ๏ผ้่ฟ
py_executableไฝฟ็จ้ขๆๅปบ็ฏๅข - ็ปๆ๏ผ็ฏๅขๆๅปบไธไปปๅกๆง่ก่งฃ่ฆ๏ผไธค่ ๅๅธๅ ถ่
Ray ็ runtime_env ่ฝ็ถๅผบๅคง๏ผไฝๅฎๆฌ่ดจไธๆฏ "ๅๅธๅผ็ใ่็นๆฌๅฐ็ใJIT ็"ใ
่ Environment Fabric ๆฏ "ไธญๅฟๅ็ใๅ
จๅฑๅ
ฑไบซ็ใAOT ็"ใ
ไปฅไธ 4 ไธช็ไบง็บงๅบๆฏ๏ผRay ๅ็ๆนๆก่งฃๅณไธไบ๏ผ่ Environment Fabric ๆฏๅฎ็พ่งฃๆณ๏ผ
้ฎ้ข๏ผ็ฃ็ๆๆฌ็็ธ
| ๆถๆ | 10 ๅฐๆบๅจ ร ๅฎ่ฃ torch (2GB) | ๆป็ฃ็ๅ ็จ |
|---|---|---|
| Ray Runtime Env (Node-local) | ๆฏๅฐๆบๅจ็ฌ็ซๅฎ่ฃ | 20 GB |
| Environment Fabric (NAS + Hardlink) | ๅ ฑไบซๅญๅจ + ็กฌ้พๆฅ | 2 GB |
Environment Fabric ๆนๆก๏ผ
- ๆๆ็ฏๅขๆๅปบๅจ NAS ๅ ฑไบซๅญๅจไธ
- ๅฉ็จ
uv็ Hardlink ๆบๅถ๏ผ็ธๅๅ ๅชๅ ็จไธไปฝ็ฉ็็ฉบ้ด - ่็ 90% ไปฅไธๅญๅจๆๆฌ
NAS ๅ
ฑไบซๅญๅจๆถๆ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ /mnt/nas/ <- NFS/EFS ๆ่ฝฝ็น โ
โ โ โ
โ โโโ envs/ <- ๆๆ็ฏๅข โ
โ โ โโโ wf-001_node-A/.venv/ <- ็ฏๅขA (torch) โ
โ โ โโโ wf-001_node-B/.venv/ <- ็ฏๅขB (torch) โโโ โ
โ โ โโโ wf-002_node-C/.venv/ <- ็ฏๅขC (torch) โโโผโ Hardlink โ
โ โ โ โ
โ โโโ uv_cache/ <- ๅ
จๅฑ็ผๅญ โโโโโโโโโ โ
โ โโโ torch-2.0.0.whl <- ็ฉ็ๆไปถๅชๅญไธไปฝ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
้ฎ้ข๏ผRay JIT ๅฏผ่ดไปปๅกๅทๅฏๅจไธๅฏๆง
sequenceDiagram
participant User
participant Ray as Ray (JIT ๆจกๅผ)
participant EnvFabric as Environment Fabric (AOT ๆจกๅผ)
participant Task
Note over Ray: Ray ๅ็ๆนๆก - ๅทๅฏๅจ
User->>Ray: ๆไบคไปปๅก
Ray->>Ray: ๅ็ฐๆฒก็ฏๅข
Ray->>Ray: ๅผๅงๆๅปบ็ฏๅข๏ผๅฏ่ฝ่ๆถๆฐๅ้๏ผ
Ray->>Task: ็ญๅพ
... ๆง่กไปปๅก
Note over EnvFabric: Environment Fabric ๆนๆก - ้ข็ญ
User->>EnvFabric: ไฟๅญๅทฅไฝๆต้
็ฝฎ
EnvFabric->>EnvFabric: ๅๅฐ้้ปๆๅปบ็ฏๅข โ
Note over User: ็จๅ...
User->>EnvFabric: ็นๅป่ฟ่ก
EnvFabric->>Task: ็ฏๅขๅทฒๅฐฑ็ปช โ ๆฏซ็ง็บงๅฏๅจ ๐
Environment Fabric ๆนๆก๏ผ
- AOT ้ขๆๅปบ๏ผ็จๆท็ผ่พๅฎๅทฅไฝๆต โ ไฟๅญ โ ๅๅฐ้้ปๆๅปบ็ฏๅข
- ๆฏซ็ง็บงๅฏๅจ๏ผ่ฟ่กๆถ็ฏๅขๅทฒๅฐฑ็ปช๏ผRay ็ดๆฅไฝฟ็จ
py_executable - ่งฃ่ฆๆๅปบไธๆง่ก๏ผ็ฏๅขๆๅปบไฝไธบ็ฌ็ซ็ฏ่๏ผไธ้ปๅกไปปๅก่ฐๅบฆ
้ฎ้ข๏ผRay ็ฏๅขๆฏ้ป็๏ผๆ ้้พๆๆฅ
| ็ปดๅบฆ | Ray Runtime Env | Environment Fabric |
|---|---|---|
| ็ฏๅขไฝ็ฝฎ | ไธดๆถ็ฎๅฝ๏ผ่ขซ GC ๅๆถๅคฑ | ๆไน ๅ็ฉ็่ทฏๅพ |
| ๆ ้ๆๆฅ | ๅช่ฝ็ Ray ๆฅๅฟ | ๅฏ SSH ่ฟๅป source .venv/bin/activate |
| ็ฏๅขๅๆป | ไธๆฏๆ | ๅฏๅฏน็ฏๅขๅ Snapshot |
| ็กฎๅฎๆง | pip list ๆพๆฃ | uv.lock ๅญ่็บง้ๅฎ |
Environment Fabric ๆนๆก๏ผ
- ็ฏๅขๆฏ็ฉ็ๅญๅจ็ๆไปถๅคน๏ผๅฏ้ๆถ่ฟๅ ฅๆๆฅ
pyproject.toml+uv.lockไฟ่ฏ็ฏๅขๅญ่็บงไธ่ด- ๆฏๆ็ฏๅข็ๆฌ็ฎก็ๅๅๆป
้ฎ้ข๏ผRay
runtime_envไธ Ray ๅผบ็ปๅฎ
Environment Fabric ๆนๆก๏ผ
- ไบงๅบๆ ๅ็
.venv่ทฏๅพ - ๅฏ่ขซไปปไฝๆง่กๅผๆๆถ่ดน
# ่ขซ Ray ๆถ่ดน
@ray.remote(runtime_env={"py_executable": venv_python_path})
def ray_task(): ...
# ่ขซ Docker ๆ่ฝฝ
# docker run -v /mnt/nas/envs:/envs python:3.11 /envs/wf-001/.venv/bin/python script.py
# ่ขซ Kubernetes Job ไฝฟ็จ
# command: ["/mnt/nas/envs/wf-001/node-A/.venv/bin/python", "main.py"]
# ่ขซ subprocess ่ฐ็จ
subprocess.run([venv_python_path, "script.py"])| ็ปดๅบฆ | Environment Fabric | Ray Runtime Env |
|---|---|---|
| ๆๅปบๆถๆบ | โฑ๏ธ AOT (ๆๅๆๅปบ) | โณ JIT (่ฟ่กๆถๆๅปบ) |
| ๅญๅจๆจกๅ | ๐พ NAS ๅ ฑไบซ + Hardlink | ๐ฆ Node-local ็ผๅญ |
| ็ฏๅข็กฎๅฎๆง | ๐ uv.lock ๅญ่็บง้ๅฎ |
๐ฒ pip list ๆพๆฃๅฃฐๆ |
| ๅทๅฏๅจๆถ้ด | ๐ ๆฏซ็ง็บง | ๐ข ๅ้็บง๏ผๅคงไพ่ต๏ผ |
| ๅฏ่ฐ่ฏๆง | โ ๆไน ๅ็ฝ็ | โ ไธดๆถ้ป็ |
| ่ฆๅๅบฆ | ๐ Vendor Agnostic | ๐ Ray ๅผบ็ปๅฎ |
| ็ฃ็ๆ็ | ๐ฐ ่็ 90%+ | ๐ ็บฟๆงๅข้ฟ |
Important
็กฌๆง้จ็ฝฒๆกไปถ
UV_CACHE_DIR ๅฟ
้กปไธ ENVS_BASE_PATH ๅจๅไธ็ฉ็ๅๅบ๏ผNAS ๆ่ฝฝ็น๏ผ๏ผๆ่ฝไฝฟ็จ Hardlink ๆบๅถใ
/mnt/nas/ <- NFS/EFS ๆ่ฝฝ็น๏ผๆๆ่็นๅ
ฑไบซ๏ผ
โ
โโโ envs/ <- ENVS_BASE_PATH
โ โโโ workflow123_node123/ <- ็ฌ็ซ UV ้กน็ฎ
โ โ โโโ .venv/ <- ่ๆ็ฏๅข
โ โ โ โโโ bin/python <- Ray py_executable ๆๅ่ฟ้
โ โ โโโ pyproject.toml <- ไพ่ตๅฃฐๆ
โ โ โโโ uv.lock <- ็ๆฌ้ๅฎ
โ โ โโโ metadata.json <- ็ฏๅขๅ
ๆฐๆฎ
โ โโโ ...
โ
โโโ uv_cache/ <- UV_CACHE_DIR๏ผๅ
จๅฑๅ
ฑไบซ็ผๅญ๏ผ
โโโ wheels/ <- .whl ๅ
ๆไปถ
โโโ archives/ <- ๆบ็ ๅ
โ
โโโ Hardlink ๆๅๅ็ฏๅข็ .venv/lib/
ๆๆฏ็ป่ๅทฒๆๅๅฐ็ฌ็ซๆๆกฃ๏ผ
| ๆๆกฃ | ๆ่ฟฐ |
|---|---|
| ๐ PRD - ไบงๅ้ๆฑๆๆกฃ | ่ๆฏใ็ฎๆ ใๅ่ฝ่ๅด |
| ๐๏ธ ARD - ๆถๆ้ๆฑๆๆกฃ | ็ณป็ปๆถๆใ็ปไปถ่ฎพ่ฎกใๅญๅจ็ญ็ฅ |
| โ๏ธ TRD - ๆๆฏ้ๆฑๆๆกฃ | API ่ง่ใ้กน็ฎ็ปๆใ้ ็ฝฎ่ฏดๆ |
- Python 3.11+
- uv ๅ ็ฎก็ๅจ
- NAS/ๅ ฑไบซๅญๅจ๏ผ็ไบง็ฏๅข๏ผ
- PostgreSQL๏ผๅฎก่ฎกๆฐๆฎๅบ๏ผ
# ๅ
้้กน็ฎ
git clone <repo-url>
cd env_manager
# ๅฎ่ฃ
ไพ่ต
uv sync
# ้
็ฝฎ็ฏๅขๅ้
cp .env.template .env
# ็ผ่พ .env ๆไปถ้
็ฝฎ DATA_ROOTใDATABASE_URL ็ญ
# ๅฏๅจๆๅก
uv run uvicorn src.api:app --host 0.0.0.0 --port 8000# ๅๅปบไธไธชๆฐ็ฏๅข
curl -X POST http://localhost:8000/envs \
-F "workflow_id=wf-001" \
-F "node_id=node-A" \
-F "packages=numpy>=1.24.0" \
-F "packages=pandas>=2.0.0"import ray
import httpx
# 1. ไป Environment Fabric ่ทๅ้ขๆๅปบ็ฏๅข่ทฏๅพ
resp = httpx.get("http://localhost:8000/envs/wf-001/node-A")
env_path = resp.json()["env_path"]
python_path = f"{env_path}/.venv/bin/python"
# 2. ้
็ฝฎ Ray ไฝฟ็จ่ฏฅ็ฏๅข
runtime_env = {"py_executable": python_path}
@ray.remote(runtime_env=runtime_env)
def my_task():
import numpy as np
return np.__version__
ray.init()
print(ray.get(my_task.remote()))