Ray Clusters สำหรับ AI: สถาปัตยกรรมการประมวลผลแบบกระจาย
อัปเดตเมื่อวันที่ 11 ธันวาคม 2025
อัปเดตธันวาคม 2025: OpenAI ใช้ Ray เพื่อประสานงานการฝึก ChatGPT Ray เข้าร่วม PyTorch Foundation ซึ่งยืนยันการนำไปใช้ในระดับองค์กร เฟรมเวิร์กสามารถขยายจากแล็ปท็อปไปจนถึง GPU นับพันตัว สามารถทำงานได้หลายล้านงานต่อวินาทีด้วย latency ระดับมิลลิวินาที—เร็วกว่า Spark หลายเท่าสำหรับรูปแบบ AI รองรับการประมวลผลแบบ heterogeneous โดยกำเนิด สามารถผสมผสาน workload ระหว่าง CPU และ GPU ได้
OpenAI ใช้ Ray เพื่อประสานงานการฝึก ChatGPT และโมเดลอื่นๆ¹ เฟรมเวิร์กนี้ขยายจากแล็ปท็อปไปจนถึงคลัสเตอร์ที่มี GPU นับพันตัว จัดการความซับซ้อนของการประมวลผลแบบกระจายที่ปกติต้องสร้างโครงสร้างพื้นฐานแบบกำหนดเองสำหรับทุกโปรเจกต์ การนำ Ray ไปใช้เติบโตอย่างรวดเร็วตลอดปี 2025 ได้รับการยืนยันจากการที่เฟรมเวิร์กเข้าร่วม PyTorch Foundation และ Anyscale ระดมทุนเพื่อสนับสนุนการปรับใช้ในองค์กร² การเข้าใจสถาปัตยกรรมและรูปแบบการปรับใช้ของ Ray ช่วยให้องค์กรสร้างโครงสร้างพื้นฐาน AI แบบกระจายที่ขยายได้ตั้งแต่การทดลองไปจนถึงระบบ production
Ray เป็นเฟรมเวิร์กแบบรวมสำหรับ workload AI แบบกระจาย—การฝึก การปรับแต่ง การ inference และการประมวลผลข้อมูล—ที่ abstract ความซับซ้อนของการจัดการคลัสเตอร์ในขณะที่ยังคงควบคุมการจัดสรรทรัพยากรได้อย่างละเอียด สำหรับองค์กรที่ก้าวข้ามการทดลองบน GPU เดียวไปสู่ระบบ production แบบหลายโหนด Ray เสนอเส้นทางที่ตรงที่สุดสู่โครงสร้างพื้นฐาน AI ที่ขยายได้
ทำไมต้องใช้ Ray สำหรับโครงสร้างพื้นฐาน AI
Ray เกิดขึ้นจาก RISELab ของ UC Berkeley เพื่อแก้ไขความท้าทายเฉพาะของ workload AI แบบกระจายที่เฟรมเวิร์กแบบดั้งเดิมอย่าง Apache Spark จัดการได้ไม่ดี:
ข้อกำหนดของ workload AI
การประมวลผลแบบ heterogeneous: ไปป์ไลน์ AI ผสมผสานการประมวลผลข้อมูลที่ใช้ CPU มากกับการฝึกและ inference ที่ใช้ GPU เร่งความเร็ว Ray รองรับการจัดสรรทรัพยากรแบบ heterogeneous โดยกำเนิด จัดตารางงานข้าม CPU และ GPU ตามที่ workload ต้องการ³
Parallelism แบบละเอียด: การฝึก deep learning ต้องประสานงาน gradient ข้ามผู้ทำงาน จัดการสถานะโมเดล และจัดการความล้มเหลวอย่างสง่างาม task และ actor abstraction ของ Ray ให้ primitive ที่จำเป็นสำหรับรูปแบบเหล่านี้
การคำนวณแบบมีสถานะ: ต่างจากเฟรมเวิร์กแบบ MapReduce workload AI มักรักษาสถานะข้ามการวนซ้ำ Ray actor รักษาสถานะระหว่างการเรียกใช้ รองรับรูปแบบเช่น parameter server และ reinforcement learning agent
Latency ต่ำ: การ inference แบบเรียลไทม์และการค้นหา hyperparameter ต้องการการจัดตารางงานระดับไมโครวินาที Ray ทำได้หลายล้านงานต่อวินาทีด้วย latency ระดับมิลลิวินาที—เร็วกว่า Spark หลายเท่าสำหรับรูปแบบเหล่านี้⁴
เปรียบเทียบกับทางเลือกอื่น
Apache Spark: ปรับให้เหมาะสำหรับการประมวลผลข้อมูลแบบ batch ด้วย SQL และ DataFrame เก่งที่ ETL, feature engineering และการวิเคราะห์ข้อมูลแบบมีโครงสร้าง เหมาะน้อยกว่าสำหรับ workload GPU การคำนวณแบบมีสถานะ และข้อกำหนด latency ต่ำ⁵
Dask: การประมวลผลแบบกระจายแบบ Python-native พร้อม DataFrame และ array API เบากว่า Spark แต่ขาด actor model และไลบรารีเฉพาะ ML ของ Ray
Horovod: โฟกัสเฉพาะการฝึก deep learning แบบกระจาย ยืดหยุ่นน้อยกว่า Ray สำหรับ workload AI ที่หลากหลาย แต่ง่ายกว่าสำหรับสถานการณ์การฝึกล้วนๆ
ข้อได้เปรียบของ Ray: เฟรมเวิร์กเดียวจัดการการประมวลผลข้อมูล การฝึก การปรับ hyperparameter และการให้บริการ inference ทีมหลีกเลี่ยงการจัดการหลายระบบและความซับซ้อนในการรวมระบบระหว่างกัน
การนำไปใช้ใน production
องค์กรใหญ่ๆ ใช้ Ray ใน production:⁶
- OpenAI: การประสานงานการฝึก ChatGPT
- Uber: แพลตฟอร์ม ML แบบกระจาย
- Instacart: กระดูกสันหลังของโครงสร้างพื้นฐาน ML
- Shopify: workload ML ใน production
- Ant Group: ML ทางการเงินขนาดใหญ่
Ray cluster รองรับได้ถึง 2,000 โหนดอย่างเป็นทางการ ทำให้สามารถขยายตามที่ต้องการสำหรับการฝึกโมเดลระดับ frontier และ inference ปริมาณสูง
สถาปัตยกรรม Ray
Core abstraction
Ray ให้ abstraction พื้นฐานสองอย่างสำหรับการคำนวณแบบกระจาย:
Task: ฟังก์ชันไร้สถานะที่ดำเนินการจากระยะไกล Ray จัดตารางงานข้ามผู้ทำงานที่มีอยู่โดยอัตโนมัติ จัดการความล้มเหลว และคืนผลลัพธ์
import ray
ray.init()
@ray.remote
def process_batch(data):
# ทำงานบนผู้ทำงานที่มีอยู่
return transform(data)
# ดำเนินการแบบขนาน
futures = [process_batch.remote(batch) for batch in batches]
results = ray.get(futures)
Actor: ออบเจกต์ที่มีสถานะกระจายทั่วคลัสเตอร์ แต่ละ actor รักษาสถานะระหว่างการเรียก method ทำให้รองรับรูปแบบเช่นการให้บริการโมเดล parameter server และสภาพแวดล้อมเกม
@ray.remote
class ModelServer:
def __init__(self, model_path):
self.model = load_model(model_path)
def predict(self, input_data):
return self.model(input_data)
# สร้าง actor instance
server = ModelServer.remote("model.pt")
# เรียก method จากระยะไกล
prediction = ray.get(server.predict.remote(data))
สถาปัตยกรรมคลัสเตอร์
Ray cluster ประกอบด้วย head node และ worker node:
Head node: รัน Global Control Store (GCS) ที่จัดการสถานะคลัสเตอร์, object directory ติดตามตำแหน่งข้อมูล และ scheduler ประสานงานการจัดวางงาน
Worker node: ดำเนินการ task และ actor แต่ละ worker รัน Raylet daemon จัดการการจัดตารางและการจัดการออบเจกต์ในเครื่อง
Object store: shared memory แบบกระจายที่ทำให้ส่งผ่านข้อมูลแบบ zero-copy ระหว่าง task บนโหนดเดียวกัน และ serialization ที่มีประสิทธิภาพข้ามโหนด
การจัดการทรัพยากร
Ray จัดการทรัพยากรแบบ heterogeneous อย่างชัดเจน:
@ray.remote(num_cpus=4, num_gpus=1)
def train_step(model, data):
# รับประกัน 4 CPU และ 1 GPU
return model.train(data)
ทรัพยากรแบบกำหนดเองทำให้จัดตารางได้ละเอียด:
# ร้องขอฮาร์ดแวร์เฉพาะ
@ray.remote(resources={"TPU": 1})
def tpu_inference(data):
return run_on_tpu(data)
ไลบรารี AI ของ Ray
Ray รวมไลบรารีที่สร้างขึ้นเฉพาะสำหรับ workload AI ทั่วไป:
Ray Train
Abstraction การฝึกแบบกระจายที่รองรับ PyTorch, TensorFlow และเฟรมเวิร์กอื่นๆ:
from ray.train.torch import TorchTrainer
from ray.train import ScalingConfig
def train_func():
# โค้ดการฝึก PyTorch มาตรฐาน
model = MyModel()
for epoch in range(10):
train_epoch(model)
trainer = TorchTrainer(
train_loop_per_worker=train_func,
scaling_config=ScalingConfig(
num_workers=8,
use_gpu=True
),
)
result = trainer.fit()
ความสามารถหลัก:⁷ - ขยายจาก GPU เดียวไปคลัสเตอร์หลายโหนดด้วยการเปลี่ยนโค้ด 2 บรรทัด - โหลดข้อมูลแบบกระจายและซิงโครไนซ์ gradient อัตโนมัติ - การจัดการ checkpoint และการกู้คืนจากความล้มเหลว - รวมกับ PyTorch Lightning, Hugging Face Transformers และ DeepSpeed
Ray Tune
การปรับ hyperparameter แบบกระจาย:
from ray import tune
from ray.tune.schedulers import ASHAScheduler
def training_function(config):
model = build_model(config["learning_rate"], config["batch_size"])
for epoch in range(100):
loss = train_epoch(model)
tune.report(loss=loss)
analysis = tune.run(
training_function,
config={
"learning_rate": tune.loguniform(1e-4, 1e-1),
"batch_size": tune.choice([32, 64, 128])
},
scheduler=ASHAScheduler(metric="loss", mode="min"),
num_samples=100,
)
Ray Tune ให้: - การทดลองแบบขนานทั่วคลัสเตอร์ - การหยุดก่อนเวลาด้วย ASHA, Population-Based Training และ scheduler อื่นๆ - รวมกับ Optuna, HyperOpt และไลบรารีการปรับแต่งอื่นๆ - การ checkpoint และการกลับมาทำงานต่อ
Ray Serve
การให้บริการโมเดลใน production พร้อม autoscaling:
from ray import serve
@serve.deployment(num_replicas=2, ray_actor_options={"num_gpus": 1})
class LLMDeployment:
def __init__(self):
self.model = load_llm()
async def __call__(self, request):
prompt = await request.json()
return self.model.generate(prompt["text"])
serve.run(LLMDeployment.bind())
ความสามารถของ Ray Serve:⁸ - Autoscaling ตามอัตราการร้องขอ - การปรับใช้แบบไม่มี downtime - การประกอบหลายโมเดลและการกำหนดเส้นทางการร้องขอ - API ที่เข้ากันได้กับ OpenAI สำหรับการให้บริการ LLM - ลด time-to-first-token 60% ด้วยการกำหนดเส้นทางแบบ prefix-aware⁹
Ray Data
การโหลดและประมวลผลข้อมูลแบบกระจาย:
import ray
ds = ray.data.read_parquet("s3://bucket/data/")
ds = ds.map(preprocess)
ds = ds.filter(lambda x: x["label"] > 0)
# แปลงเป็น PyTorch DataLoader
train_loader = ds.iter_torch_batches(batch_size=32)
Ray Data ให้: - การดำเนินการแบบ streaming สำหรับชุดข้อมูลขนาดใหญ่ - การประมวลผลล่วงหน้าที่ใช้ GPU เร่งความเร็ว - รวมกับ Ray Train สำหรับการฝึกแบบกระจาย - รองรับข้อมูลภาพ ข้อความ และตารางโดยกำเนิด
การปรับใช้ Kubernetes ด้วย KubeRay
การปรับใช้ Ray ใน production มักรันบน Kubernetes โดยใช้ KubeRay ซึ่งเป็น Kubernetes operator อย่างเป็นทางการ:¹⁰
ส่วนประกอบ KubeRay
RayCluster CRD: กำหนดการตั้งค่าคลัสเตอร์รวมถึงข้อกำหนด head และ worker node นโยบาย autoscaling และข้อกำหนดทรัพยากร
apiVersion: ray.io/v1
kind: RayCluster
metadata:
name: ml-cluster
spec:
headGroupSpec:
rayStartParams:
dashboard-host: '0.0.0.0'
template:
spec:
containers:
- name: ray-head
image: rayproject/ray:2.52.0-py310-gpu
resources:
limits:
nvidia.com/gpu: 1
workerGroupSpecs:
- replicas: 4
minReplicas: 2
maxReplicas: 10
groupName: gpu-workers
rayStartParams: {}
template:
spec:
containers:
- name: ray-worker
image: rayproject/ray:2.52.0-py310-gpu
resources:
limits:
nvidia.com/gpu: 1
RayJob CRD: ส่งงานไปยังคลัสเตอร์ที่จัดเตรียมโดยอัตโนมัติ KubeRay สร้างคลัสเตอร์ รันงาน และลบคลัสเตอร์เมื่อเสร็จสิ้น (ถ้าต้องการ)
RayService CRD: การปรับใช้ Ray Serve แบบจัดการพร้อมการอัปเกรดแบบไม่มี downtime และการตรวจสอบสุขภาพ
แนวปฏิบัติที่ดีสำหรับ production
Container image: ฝัง dependency ไว้ใน Docker image ที่เผยแพร่แทนที่จะติดตั้งขณะรัน สิ่งนี้รับประกันความสามารถทำซ้ำและเริ่มต้นเร็วขึ้น¹¹
Autoscaling: เปิดใช้ทั้ง Ray autoscaling (ขยาย worker ภายในคลัสเตอร์) และ Kubernetes autoscaling (ขยายโหนดคลัสเตอร์):
spec:
enableInTreeAutoscaling: true
autoscalerOptions:
upscalingMode: Default
idleTimeoutSeconds: 60
Storage: ใช้ persistent volume สำหรับ checkpoint และ shared storage สำหรับชุดข้อมูลขนาดใหญ่:
volumes:
- name: shared-storage
persistentVolumeClaim:
claimName: ml-data-pvc
Monitoring: รวมกับ Prometheus และ Grafana เพื่อการสังเกตการณ์:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
การปรับใช้เฉพาะคลาวด์
GKE: Ray on GKE add-on ให้ Ray cluster แบบจัดการพร้อมการจัดเตรียมอัตโนมัติและการรวมกับบริการ Google Cloud¹²
EKS: ปรับใช้ KubeRay กับ Cluster Autoscaler หรือ Karpenter สำหรับการขยายโหนด การรวมกับ FSx for Lustre ให้ shared storage ประสิทธิภาพสูง
AKS: Microsoft และ Anyscale เสนอ Anyscale on Azure เป็นบริการ first-party ที่เข้าถึงได้จาก Azure Portal¹³
Anyscale managed Ray
Anyscale บริษัทที่ก่อตั้งโดยผู้สร้าง Ray เสนอการปรับใช้ Ray แบบจัดการ:
Anyscale Platform
Managed cluster: Ray cluster ระดับ production พร้อม scaling อัตโนมัติ fault tolerance และ monitoring โดยไม่ต้องจัดการโครงสร้างพื้นฐาน
RayTurbo runtime: การปรับปรุงประสิทธิภาพที่เป็นกรรมสิทธิ์ให้ความยืดหยุ่นสูงขึ้น ประสิทธิภาพเร็วขึ้น และต้นทุนต่ำกว่าเมื่อเทียบกับ Ray แบบ open-source¹⁴
Enterprise feature: การควบคุมการเข้าถึงตามบทบาท audit logging, VPC peering และใบรับรองการปฏิบัติตามข้อกำหนด
ความร่วมมือกับคลาวด์
CoreWeave: Anyscale BYOC (Bring Your Own Cloud) ปรับใช้โดยตรงในบัญชีลูกค้า CoreWeave ผ่าน CoreWeave Kubernetes Service¹⁵
Azure: บริการ Anyscale แบบ first-party พร้อมใช้งานใน Azure Portal พร้อมการรวมแบบ native
AWS: Anyscale ดำเนินการบน AWS พร้อมการรวมกับบริการ AWS ที่มีอยู่
เมื่อไหร่ควรใช้ Anyscale
**พิจารณา Anysc