大模型联邦学习配置:从零搭建本地训练环境
联邦学习让多个参与方在不共享原始数据的前提下协作训练模型。
如果你手头有一台带GPU的服务器或工作站,想快速跑通大模型联邦学习的配置,本文按“准备环境→安装依赖→编写配置→启动训练→验证结果”的顺序,给出可以直接照做的命令和代码片段。
环境准备:确认硬件与系统版本
先确认机器满足最低要求。
大模型联邦学习对显存和内存有一定要求,建议至少16GB显存、32GB内存,系统用Ubuntu 20.04或22.04。
执行以下命令查看基础信息:
nvidia-smi
free -h
df -h
nvidia-smi能正常输出显卡型号和驱动版本,说明GPU驱动已就绪。
如果提示命令不存在,需要先安装NVIDIA驱动,这一步不在本文展开,可参考显卡厂商文档。
接着安装Python 3.9或3.10,并创建独立虚拟环境,避免污染系统包:
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3-pip
python3.10 -m venv ~/fl-env
source ~/fl-env/bin/activate
激活后命令行提示符前会出现(fl-env),表示已进入虚拟环境。
后续所有安装和运行都在这个环境里进行。
安装依赖:PyTorch与联邦学习框架
大模型训练依赖PyTorch,联邦学习协调层选用Flower(一个轻量级的联邦学习框架)。
先装PyTorch,根据CUDA版本选择对应命令。
用nvidia-smi右上角显示的CUDA Version,例如12.1,则执行:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
如果网络较慢,可以临时换用国内镜像源,但注意镜像源可能同步滞后,安装后建议用pip show torch核对版本。
然后安装Flower和常用工具:
pip install flwr[simulation] numpy pandas
安装完成后,用下面命令验证关键包是否可导入:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
python -c "import flwr; print(flwr.__version__)"
如果torch.cuda.is_available()返回True,说明GPU可用;
返回False则检查驱动和CUDA版本是否匹配。
配置联邦学习任务:定义模型与客户端
新建项目目录,
例如~/fl-demo,
在里面创建两个文件:model.py和client.py。model.py定义一个简单的大模型结构,
这里用小型Transformer示意,
实际替换成你的模型即可:
# model.py
import torch
import torch.nn as nn
class TinyModel(nn.Module):
def __init__(self, vocab_size=1000, hidden=128):
super().__init__()
self.embed = nn.Embedding(vocab_size, hidden)
self.fc = nn.Linear(hidden, 2)
def forward(self, x):
return self.fc(self.embed(x).mean(dim=1))
def get_model():
return TinyModel()
client.py负责加载本地数据、训练和向服务器上报参数。
Flower的客户端需要实现fit和evaluate方法:
# client.py
import flwr as fl
import torch
from model import get_model
class FLClient(fl.client.NumPyClient):
def __init__(self):
self.model = get_model()
self.optimizer = torch.optim.SGD(self.model.parameters(), lr=0.01)
def get_parameters(self, config):
return [val.cpu().numpy() for val in self.model.state_dict().values()]
def fit(self, parameters, config):
state = self.model.state_dict()
for k, v in zip(state.keys(), parameters):
state[k] = torch.tensor(v)
self.model.load_state_dict(state)
# 这里替换为你的真实数据加载逻辑
x = torch.randint(0, 1000, (32, 10))
y = torch.randint(0, 2, (32,))
loss_fn = torch.nn.CrossEntropyLoss()
self.optimizer.zero_grad()
loss = loss_fn(self.model(x), y)
loss.backward()
self.optimizer.step()
return self.get_parameters(config), 32, {"loss": loss.item()}
def evaluate(self, parameters, config):
return 0.5, 32, {"accuracy": 0.8}
服务端用Flower自带的start_server启动,指定轮数和最小客户端数:
python -m flwr.server start --num-rounds 3 --min-num-clients 1
另开一个终端,激活同一虚拟环境,启动客户端并连接到本机服务端:
python -c "import flwr as fl; from client import FLClient; fl.client.start_numpy_client(server_address='127.0.0.1:8080', client=FLClient())"
看到服务端打印聚合进度、客户端打印训练loss,说明配置基本跑通。
避坑指南:依赖冲突与网络配置
依赖冲突是最常见的问题。
PyTorch和Flower对numpy版本可能有不同要求,安装时如果出现ERROR: pip's dependency resolver提示,优先按提示升级或降级numpy,不要直接忽略。
建议在虚拟环境里用pip freeze > requirements.txt记录当前版本,方便回滚。
端口不通时,先确认服务端监听地址。
默认127.0.0.1:8080只允许本机连接,如果客户端在另一台机器,需要把服务端启动参数改为--server-address 0.0.0.0:8080,并检查防火墙是否放行8080端口:
sudo ufw allow 8080/tcp
sudo ufw status
显存不足报错CUDA out of memory时,减小batch_size或模型规模。
示例中batch_size为32,实际大模型可能需要降到4或8。
客户端连不上服务端,先ping测试网络,再用telnet 服务端IP 8080确认端口可达。
如果服务端在云服务器上,检查安全组入方向规则是否放行。
验证配置是否生效
跑完一轮训练后,从三个层面确认结果:
- 服务端日志出现
Round 1、aggregate等字样,且没有异常退出。 - 客户端
fit返回的loss值有变化,不是恒定不变。 - 用
nvidia-smi观察训练期间GPU利用率是否上升,若一直为0,说明模型没有在GPU上运行,检查代码中是否调用了.to('cuda')。
最后保存一次模型参数,确认文件能正常写出:
python -c "import torch; from model import get_model; m=get_model(); torch.save(m.state_dict(), 'test.pt'); print('saved')"
只要上述检查项都通过,大模型联邦学习配置就算完成。
后续可以替换真实数据集、增加客户端数量,并调整聚合策略。
遇到报错时,优先回看虚拟环境是否激活、依赖版本是否匹配、端口和防火墙是否放行,这三类问题占了新手配置失败的大多数。