)
Flower 快速入门使用 C 客户端在合成数据上训练线性模型quickstart-cpp 全解析【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower本指南以 examples/quickstart-cpp/README.md 为核心完整讲解如何在 Flower 联邦学习框架中构建并运行一个纯 C 实现的客户端通过 CMake 编译出可执行文件flwr_client在合成数据集上使用随机梯度下降SGD训练线性模型并与flwr-superlinkSuperLink和 Flower ServerApp 协同完成多客户端联邦平均FedAvg训练。阅读完本文你将掌握 C 客户端从编译、参数传递、gRPC 连接到与服务端进行参数序列化交换的完整链路并理解其背后的源码实现。[!WARNING] 按照原文档说明该示例当前兼容flwr1.13.0官方正在将其迁移到更新的flwr run应用运行方式。在 1.13.0 及以上版本中运行本示例时请注意版本兼容性问题。示例概览C 客户端 合成线性回归quickstart-cpp是 Flower 仓库中展示非 Python 客户端接入方式的典型示例。与大多数使用 Python 编写Client的示例不同这里训练逻辑、数据生成与模型更新全部由 C 完成客户端进程独立于 Python 运行仅通过 gRPC 与 Flower 服务端通信。示例的训练目标是一个线性模型y b m_0 * x_0 m_1 * x_1两个特征、一个偏置。数据由客户端本地合成生成没有任何真实数据集依赖因此非常适合快速验证 C 客户端的完整通信流程。从 examples/quickstart-cpp 目录结构可以看到项目由三部分组成include/与src/C 客户端源码包括入口 main.cc、客户端实现 simple_client.h / simple_client.cc、线性模型 line_fit_model.h / line_fit_model.cc、合成数据集 synthetic_dataset.h / synthetic_dataset.cc 以及线性代数工具 linear_algebra_util.hCMakeLists.txt负责拉取 gRPC 与 Flower C SDK 并完成编译fedavg_cpp.py与server.py服务端策略与 ServerApp 定义。环境准备与依赖运行本示例需要两类依赖CMake用于配置和构建 C 客户端CMakeLists.txt要求 CMake 最低版本 3.16并要求编译器支持 C17Python 环境中的flwr用于启动 SuperLink 与 ServerApp。C 客户端本身不依赖外部机器学习库如 TensorFlow、PyTorch其训练与求值逻辑均为手写的线性代数运算这大大降低了编译门槛。构建 C 客户端原文档给出的构建命令如下cmake -S . -B build cmake --build build第一条命令以当前目录为源码根目录-S .在build/目录下生成构建系统第二条命令执行实际编译最终产物为build/flwr_client。CMake 构建配置解析CMakeLists.txt 揭示了构建过程的核心机制值得深入理解拉取 gRPC通过FetchContent从 gRPC 官方仓库下载固定版本v1.43.2并链接grpc、libprotobuf、grpc_reflection等库为客户端提供 gRPC 通信能力获取 Flower C SDK默认情况下同样通过FetchContent拉取 Flower 仓库GIT_TAG main将其中的framework/cc/flwr目录作为 SDK 源码若设置USE_LOCAL_FLWRON选项则直接使用当前仓库本地路径../..即本仓库根目录下的framework/cc/flwr编译 SDK 与客户端SDK 源码通过file(GLOB FLWR_SRCS .../src/*.cc)与 proto 生成的.cc文件一起编译为flwr静态库客户端自身源码src/*.cc编译为可执行文件flwr_client。也就是说本示例本质上演示了如何在任意 C 项目中接入 Flower 的 C SDK 并构建自己的联邦客户端。SDK 本身位于 framework/cc/flwr包含client.h客户端抽象基类、communicator.h、message_handler.h、serde.h、start.h等核心头文件。运行联邦训练SuperLink 两个 C 客户端 ServerApp原文档给出了四终端运行方式分别启动四个进程终端 1启动 SuperLinkflwr-superlink --insecure--insecure表示以非 TLS 明文方式启动便于本地开发调试。终端 2 与终端 3启动两个 C 客户端build/flwr_client 0 127.0.0.1:9092build/flwr_client 1 127.0.0.1:9092其中0/1为客户端 ID127.0.0.1:9092是 SuperLink 暴露的 gRPC 服务地址注意端口为9092而非 Python 客户端常用的8080。终端 4启动 Flower ServerAppflower-server-app server:app --insecure该命令加载 server.py 中定义的app对象并以不安全模式运行。客户端入口参数解析与本地数据构造main.cc 是 C 客户端的入口逻辑非常清晰参数校验要求恰好两个命令行参数CLIENT_ID和SERVER_URL否则打印用法提示并退出构造本地数据集使用真实参数ms {3.5, 9.3}、偏置b 1.7分别生成三份合成数据——训练集 1000 条、验证集 100 条、测试集 500 条定义模型LineFitModel model LineFitModel(500, 0.01, ms.size())即 500 次迭代、学习率 0.01、2 个特征参数创建客户端并启动实例化SimpleFlwrClient调用start::start_client(server_add, client)建立 gRPC 连接并开始与 SuperLink 通信。合成数据生成原理SyntheticDataset 的构造函数见 synthetic_dataset.cc按给定真实参数生成带噪声的线性数据特征x在[-10, 10]区间均匀采样标签由y b Σ m_i * x_i计算得出每条样本的特征与标签拼接后存入data_points标签位于向量末尾。get_features_count()返回特征数总长度减 1。线性模型与本地 SGD 训练LineFitModel 实现了一个可被服务端下发/上传参数的线性回归模型参数随机初始化权重在[-10, 10]间均匀随机初始化偏置初始为 0batch size 固定为 64前向预测predict(X)计算Σ pred_weights[j] * X[i][j] pred_b本地训练train_SGD在每个迭代中随机打乱数据索引、抽取一个 batch计算预测误差与梯度按学习率执行梯度下降更新权重与偏置并每 250 次迭代打印一次均方误差MSE本地评估evaluate在测试集上计算 MSE 并返回(样本数, loss, loss)。C 客户端实现 Flower 客户端协议simple_client.h 中SimpleFlwrClient继承自 Flower C SDK 的抽象基类flwr_local::Client定义于 framework/cc/flwr/include/client.h并实现了四个纯虚方法这与 Python 端flwr.client.Client的方法一一对应C 方法对应 Python 方法职责get_parameters()get_parameters返回当前本地模型参数get_properties(ins)get_properties返回客户端属性fit(ins)fit使用服务端下发的参数在本地数据上训练返回更新后的参数与样本数evaluate(ins)evaluate使用下发参数在本地测试集上评估返回样本数、loss 与指标以fit为例见 simple_client.cc先通过set_parameters把服务端下发的全局参数写入本地模型再调用model.train_SGD(training_dataset)完成本地训练最后把新参数与num_examples封装进FitRes返回。evaluate流程类似额外将 loss 封装为Scalar写入metrics[loss]。客户端启动与 gRPC 通信start::start_client定义于 framework/cc/flwr/include/start.h其职责是创建 gRPC 通道连接服务器并启用消息通信。值得注意的是它暴露了第三个可选参数grpc_max_message_length默认值为 536870912512 MB用于限制与 Flower 服务端交换的 gRPC 消息最大长度训练超大模型时若需调大该值必须同时以相同值启动服务端否则服务端会因限制不一致而阻塞大消息。服务端实现为 C 客户端定制的 FedAvg 策略服务端由两部分组成server.py 与 fedavg_cpp.py。ServerApp 定义server.py 非常精简import flwr as fl import numpy as np from fedavg_cpp import FedAvgCpp, weights_to_parameters model_size 2 initial_weights [ np.array([1.0, 2.0], dtypenp.float64), np.array([3.0], dtypenp.float64), ] initial_parameters weights_to_parameters(initial_weights) strategy FedAvgCpp(initial_parametersinitial_parameters) app fl.server.ServerApp( configfl.server.ServerConfig(num_rounds3), strategystrategy, )其中num_rounds3表示整个联邦训练共进行 3 轮初始参数通过weights_to_parameters转换为Parameters对象首轮即下发或由 C 客户端get_parameters上报后聚合。FedAvgCppC 与 Python 之间的翻译层fedavg_cpp.py 继承flwr.server.strategy.FedAvg重写了aggregate_fit与aggregate_evaluate核心价值在于解决C 客户端与 Python 服务端的二进制数据互通问题weights_to_parameters把 NumPy 权重数组按 8 字节一个double逐段打包为字节串并标记tensor_typecpp_doubleparameters_to_weights把Parameters中的字节串还原为 NumPy 权重bytes_to_ndarray/ndarray_to_bytes利用struct.unpack(d, ...)/struct.pack(%sd, ...)完成字节流与 double 序列的互转。对比 C 侧SimpleFlwrClient::get_parameterssimple_client.cc使用std::ostringstream::write将std::vectordouble与偏置double序列化为原始字节并以cpp_double作为 tensor 类型标识返回set_parameters则用reinterpret_castconst double*把收到的字节重新解释为权重数组与偏置。两端以double 原始字节 8 字节对齐的约定完成参数交换这就是cpp_double这一自定义tensor_type的意义所在。FedAvgCpp的聚合逻辑与标准 FedAvg 一致aggregate_fit按各客户端样本数加权平均权重aggregate_evaluate按样本数加权平均 loss。客户端与 SDK 的进一步探索若希望深入定制自己的 C 客户端可以在本仓库中继续阅读客户端抽象基类与四个虚方法的完整定义framework/cc/flwr/include/client.hgRPC 通信启动入口与消息长度限制说明framework/cc/flwr/include/start.hC SDK 通信、序列化与消息处理实现framework/cc/flwr/src/communicator.cc、framework/cc/flwr/src/serde.cc、framework/cc/flwr/src/message_handler.ccFlower 的 gRPC/Proto 定义位于 framework/proto/flwrSDK 中已包含由其生成的.pb.h/.pb.cc见 framework/cc/flwr/include/flwr/proto。小结quickstart-cpp展示了 Flower 生态中一种重要的扩展形态客户端不必使用 Python。通过本示例你可以完整掌握用 CMake 构建集成 gRPC 与 Flower C SDK 的客户端C 客户端如何通过实现get_parameters/fit/evaluate等虚方法接入联邦训练流程C 客户端与服务端之间如何以cpp_double二进制格式交换模型参数在 SuperLink ServerApp 架构下同时运行多个异构客户端完成 FedAvg 训练。在当前仓库的框架代码中C SDK 仍处于持续演进状态原文档标注为 under development且本示例即将迁移到flwr run的新运行方式。对于希望在生产环境中使用 C 客户端的开发者建议同时关注这两个演进方向并以flwr1.13.0环境复现本文全部命令。【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考