OpenELM 是 Apple 开源的高效语言模型家族(Open-source Efficient Language Models),支持分布式训练和推理,适合集群部署。
假设集群包含以下节点(可按需调整):
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础工具
sudo apt install -y git curl wget vim net-tools openssh-server推荐使用 Conda 管理环境:
# 安装 Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
eval "$(~/miniconda3/bin/conda shell.bash hook)"
conda init
# 创建 OpenELM 环境
conda create -n openelm python=3.10 -y
conda activate openelm根据 GPU 驱动选择对应 PyTorch 版本(以 CUDA 12.1 为例):
# 安装 PyTorch(含 CUDA)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 安装 OpenELM 依赖
git clone https://github.com/apple/OpenELM.git
cd OpenELM
pip install -e .
pip install -r requirements.txt # 若存在若使用 FSDP(全分片数据并行)或 DDP(分布式数据并行):
# 安装用于分布式通信的库(如 NCCL,GPU 环境)
sudo apt install -y libnccl2 libnccl-dev在主节点生成密钥并分发到所有节点:
# 主节点生成密钥
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
# 复制公钥到所有节点(包括自身)
ssh-copy-id user@worker1-ip
ssh-copy-id user@worker2-ip
# ... 其他节点所有节点编辑 /etc/hosts,添加节点映射:
sudo vim /etc/hosts示例:
192.168.1.100 head-node
192.168.1.101 worker1
192.168.1.102 worker2主节点/存储节点配置 NFS 服务器:
# 安装 NFS 服务
sudo apt install -y nfs-kernel-server
# 创建共享目录
sudo mkdir -p /shared/openelm
sudo chown -R $USER:$USER /shared/openelm
sudo chmod 777 /shared/openelm
# 配置共享权限
echo "/shared/openelm *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -a
sudo systemctl restart nfs-kernel-server计算节点挂载 NFS:
# 安装 NFS 客户端
sudo apt install -y nfs-common
# 挂载共享目录
sudo mkdir -p /shared/openelm
sudo mount head-node:/shared/openelm /shared/openelm
# 永久挂载(编辑 /etc/fstab)
echo "head-node:/shared/openelm /shared/openelm nfs defaults 0 0" | sudo tee -a /etc/fstab若使用 SLURM(专业集群调度器,可选):
# 安装 SLURM
sudo apt install -y slurm-wlm
# 配置 slurm.conf(参考官方模板)
# 启动服务
sudo systemctl start slurmctld
sudo systemctl start slurmd若轻量使用,可直接用 Torch 分布式启动脚本。
每个计算节点运行 分布式训练/推理脚本,通过主节点协调:
# 示例:使用 torchrun 启动分布式训练
torchrun \
--nproc_per_node=4 \ # 每节点 GPU 数
--nnodes=3 \ # 总节点数
--node_rank=0 \ # 当前节点编号(主节点 0,worker1 为 1,依此类推)
--master_addr=head-node-ip \
--master_port=29500 \
train.py \
--model apple/OpenELM-270M \
--data_path /shared/openelm/data \
--output_dir /shared/openelm/output# 主节点测试 SSH 到所有 worker
ssh worker1 "echo 'Worker1 connected'"
ssh worker2 "echo 'Worker2 connected'"创建 test_dist.py:
import torch
import torch.distributed as dist
def test_distributed():
dist.init_process_group(backend="nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()
print(f"Rank {rank}/{world_size} initialized")
dist.destroy_process_group()
if __name__ == "__main__":
test_distributed()运行:
torchrun --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr=head-node-ip --master_port=29500 test_dist.pyexport NCCL_SOCKET_IFNAME=eth0 # 网络接口名
export NCCL_DEBUG=INFOnvidia-smi 和 PyTorch 识别 GPU:import torch
print(torch.cuda.is_available())搭建 OpenELM 集群核心步骤:
torchrun 或调度器启动分布式任务根据你的需求(训练/推理、规模),可调整节点配置和调度策略。如需更专业的集群管理,建议集成 Kubernetes(使用 Kubeflow 或 PyTorch Operator)。