Distributed Keras远程部署指南:Punchcard服务器+Secret认证,3行代码提交大集群训练任务
【免费下载链接】dist-kerasDistributed Deep Learning, with a focus on distributed training, using Keras and Apache Spark.项目地址: https://gitcode.com/gh_mirrors/di/dist-keras
Distributed Keras(dist-keras)是构建在 Apache Spark 与 Keras 之上的分布式深度学习框架,专注大规模分布式训练。本文带你走通它的远程部署机制:用 Punchcard 服务器接收作业、用 Secret 密钥完成认证,只需 3 行代码即可把本地 notebook 里训练好的模型提交到大集群上训练,并自动取回训练好的模型。🚀
一、为什么需要远程部署
在实际项目中,模型开发和大作业提交往往发生在两台不同的机器上:
- 📓本地/Notebook 服务器:用小数据集调试模型结构与超参数;
- 🏭远端 Hadoop / Spark 集群:真正的海量数据存放在 HDFS 上,大模型训练必须提交到集群执行。
如果没有远程部署能力,你就得手动编写 Spark 集群作业、处理数据读取、再手动搬运训练结果。Distributed Keras 把这个流程简化成:本地定义好训练器(trainer)→ 发送给远端的 Punchcard 服务器 → 服务器自动生成集群作业代码并执行 → 训练结束后把模型和历史曲线发回本地。整个架构如下:
二、Punchcard 服务器工作原理
Punchcard 是基于 Flask 的轻量作业调度服务(实现见 distkeras/job_deployment.py),它在集群侧监听请求,并通过一组 REST 接口完成作业全生命周期管理:
| 接口 | 方法 | 作用 |
|---|---|---|
/api/submit | POST | 提交训练作业(必须携带合法 secret) |
/api/state | GET | 查询作业是否仍在运行 |
/api/cancel | GET | 取消正在运行的作业 |
/api/destroy | GET | 作业完成后取回模型与训练历史 |
它的工作流程是:
- 认证:校验请求中的 secret 是否在密钥文件中、是否正在被占用,不合法则返回 403;
- 执行:把 trainer 序列化落盘,自动生成 Spark 作业脚本(以
yarn-client模式提交集群),从 HDFS 读取 Parquet 数据开始训练; - 回传:训练完成后,模型和 history 可通过
/api/destroy拉回本地。
Distributed Keras 的大多数训练器采用异步数据并行方式,多个 Worker 各自训练模型副本并异步向 Parameter Server 汇报参数更新:
三、生成 Secret 完成用户认证
Punchcard 只接受持有合法密钥(secret)的请求。secret 本质上是一个用户身份的长随机字符串,一个用户可以拥有多个 secret。
🔐 项目自带了密钥生成脚本 scripts/generate_secret.py,为指定身份生成一个 64 位随机密钥:
python scripts/generate_secret.py --identity userX将输出的 JSON 结构追加到密钥文件secrets.json中,其结构如下:
[ { "secret": "secret_of_user_1", "identity": "user1" }, { "secret": "secret_of_user_2", "identity": "user2" } ]四、启动 Punchcard 服务器
密钥文件准备好后,在集群侧一条命令启动服务器(入口脚本为 scripts/punchcard.py):
python scripts/punchcard.py --secrets /path/to/secrets.json --port 8000- 默认端口为
8000,默认密钥文件为当前目录下的secrets.json; - 服务器启动后监听
0.0.0.0,即可接受来自远端 notebook 的作业提交。
五、3 行代码提交大集群训练任务
回到本地 notebook,先定义好分布式训练器(如ADAG、DOWNPOUR等,均来自 distkeras/trainers.py),然后只需 3 行代码完成提交:
job = Job(secret, job_name, data_path, num_executors, num_processes, trainer) job.send('http://yourcluster:8000') job.wait_completion()各参数含义:
secret:上一步生成的认证密钥;data_path:HDFS 上 Parquet 数据的路径;num_executors/num_processes:Spark 集群的 executor 数量与每个 executor 的进程数;trainer:本地定义好的分布式训练器,会被自动序列化发送到集群。
wait_completion()内部会轮询/api/state,直到远端作业结束,并通过/api/destroy取回结果。接下来两行即可拿到成果:
trained_model = job.get_trained_model() # 训练好的 Keras 模型 history = job.get_history() # loss / accuracy 训练历史训练过程不需要任何手工干预:作业脚本、数据读取、模型保存、临时文件清理都由 Punchcard 自动完成(序列化/反序列化工具见 distkeras/utils.py)。
六、为什么要提交到大集群?
大集群的价值在实验数据中一目了然。下面这组 ADAG 优化器的实验对比显示:随着并行 Worker 数量增加,训练墙钟时间从 1200 秒以上快速下降到 250 秒左右,而中心模型精度稳定在 0.97 附近、几乎不随 Worker 数下降——这正是分布式 Keras 支持远程部署的初衷:
七、常见问题速查
| 问题 | 说明 |
|---|---|
| 返回 403 是什么情况? | secret 不在密钥文件中,或该 secret 已有作业在运行 |
| 一个 secret 能并行跑多个作业吗? | 不能,Punchcard 保证同一 secret 同时只执行一个作业 |
| 数据需要什么格式? | 当前假设 HDFS 上的 Parquet 文件(后续计划支持从 HDFS 直接读写 Keras 模型) |
| 集群作业以什么模式运行? | 生成的 Spark 作业固定使用yarn-client模式提交 |
| 支持 Python 3 吗? | 项目已知待改进项之一,目前建议 Python 2 环境运行 |
💡小结:Distributed Keras 的远程部署方案 =Secret 密钥认证 + Punchcard 作业调度。集群侧一条命令起服务,本地 3 行代码提交作业,模型与训练历史自动回传——让你把精力放在模型与算法上,而不是繁琐的集群运维上。更多分布式优化器(ADAG、DynSGD、AEASGD、DOWNPOUR、Ensemble 等)的用法可以参考示例笔记 examples/workflow.ipynb。
【免费下载链接】dist-kerasDistributed Deep Learning, with a focus on distributed training, using Keras and Apache Spark.项目地址: https://gitcode.com/gh_mirrors/di/dist-keras
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考