前言
近年来,随着人工智能技术的发展,深度学习成为了研究的热点。然而,深度学习的训练需要消耗大量的计算资源,传统的服务器往往无法满足需求。Serverless 架构则提供了一种新的解决方案,可以根据需求动态分配计算资源,从而更加高效地进行神经网络训练。
本文将介绍如何使用 Serverless Framework 进行神经网络训练实践,并分享一些经验和注意事项。
准备工作
在使用 Serverless Framework 进行神经网络训练之前,需要进行一些准备工作:
安装 Serverless Framework。可以通过 npm 安装,具体请参考 官方文档。
准备训练数据和模型。这里以 MNIST 手写数字识别为例,可以在 Kaggle 上下载训练数据和测试数据。同时,需要准备一个用于训练的神经网络模型,可以使用 TensorFlow、Keras 等框架搭建。
搭建 Serverless 服务
在准备好数据和模型之后,可以开始搭建 Serverless 服务。这里以 AWS Lambda 为例,其他云平台也可以使用类似的方式。
- 创建 Serverless 项目
使用 Serverless Framework 创建一个新的项目:
$ serverless create --template aws-nodejs --path mnist
其中,aws-nodejs 表示使用 Node.js 运行时环境,mnist 是项目的名称。
- 安装依赖
进入项目目录,安装需要的依赖:
$ cd mnist $ npm install --save-dev serverless-python-requirements $ npm install --save aws-sdk
其中,serverless-python-requirements 是用于打包 Python 依赖的插件,aws-sdk 是用于调用 AWS Lambda API 的 SDK。
- 配置 Serverless 服务
编辑 serverless.yml 文件,配置 Serverless 服务:
// www.javascriptcn.com code example
service: mnist
provider:
name: aws
runtime: nodejs14.x
region: us-east-1
functions:
train:
handler: handler.train
timeout: 900
memorySize: 3008
environment:
S3_BUCKET: ${self:custom.s3Bucket}
MODEL_FILE: ${self:custom.modelFile}
DATA_DIR: ${self:custom.dataDir}
events:
- http:
path: train
method: post
custom:
s3Bucket: mnist
modelFile: model.h5
dataDir: data其中,provider 指定了使用的云平台和运行时环境,functions 指定了要部署的函数,custom 定义了一些自定义变量。
- 编写训练函数
在 handler.js 文件中,编写训练函数:
// www.javascriptcn.com code example
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const { spawn } = require('child_process');
exports.train = async (event, context) => {
const { s3Bucket, modelFile, dataDir } = process.env;
const { key } = JSON.parse(event.body);
const dataUrl = `s3://${s3Bucket}/${dataDir}/${key}`;
const modelUrl = `s3://${s3Bucket}/${modelFile}`;
const trainProcess = spawn('python', ['train.py', dataUrl, modelUrl]);
trainProcess.stdout.on('data', (data) => {
console.log(data.toString());
});
trainProcess.stderr.on('data', (data) => {
console.error(data.toString());
});
await new Promise((resolve, reject) => {
trainProcess.on('exit', (code) => {
if (code === 0) {
resolve();
} else {
reject(new Error(`Training failed with code ${code}`));
}
});
});
const modelData = await S3.getObject({ Bucket: s3Bucket, Key: modelFile }).promise();
return {
statusCode: 200,
body: modelData.Body.toString('base64'),
isBase64Encoded: true,
headers: { 'Content-Type': 'application/octet-stream' },
};
};其中,train 函数从请求中获取训练数据的 S3 对象键值,使用 spawn 函数调用 Python 脚本进行训练,并将训练结果存储到 S3 中。最后,返回训练好的模型数据。
- 编写训练脚本
在项目根目录下,创建一个 Python 脚本 train.py,用于训练神经网络模型:
// www.javascriptcn.com code example
import sys
import os
import boto3
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
data_url = sys.argv[1]
model_url = sys.argv[2]
s3 = boto3.client('s3')
bucket_name, data_key = data_url[5:].split('/', 1)
bucket_name, model_key = model_url[5:].split('/', 1)
data_file = '/tmp/data.npz'
model_file = '/tmp/model.h5'
s3.download_file(bucket_name, data_key, data_file)
with np.load(data_file) as data:
x_train = data['x_train']
y_train = data['y_train']
x_test = data['x_test']
y_test = data['y_test']
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax'),
])
model.compile(optimizer=Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10)
model.save(model_file)
s3.upload_file(model_file, bucket_name, model_key)其中,train.py 从 S3 中下载训练数据,使用 TensorFlow 搭建神经网络模型,并进行训练。最后,将训练好的模型上传到 S3 中。
- 上传数据和模型
将训练数据和模型上传到 S3 中:
$ aws s3 cp train.csv s3://mnist/data/train.csv $ aws s3 cp test.csv s3://mnist/data/test.csv $ aws s3 cp model.h5 s3://mnist/model.h5
进行训练
部署 Serverless 服务:
$ serverless deploy
使用 Postman 或其他工具发送 POST 请求,触发训练函数:
POST https://<api-gateway-endpoint>/train
Body: {"key": "train.csv"}其中,<api-gateway-endpoint> 是 API Gateway 的 URL,可以在 Serverless Framework 部署成功后查看。
等待训练完成后,即可从返回结果中获取训练好的模型数据,用于预测测试数据的结果。
注意事项
使用 Serverless Framework 进行神经网络训练需要注意以下几点:
Serverless 架构不适合长时间运行的任务,需要设置合适的超时时间和内存大小。
Serverless 架构不适合大规模并行的任务,需要根据实际需求动态调整计算资源。
Serverless 架构需要使用云平台提供的 API Gateway 和存储服务,需要熟悉相关 API 和 SDK。
Serverless 架构需要使用 Python 依赖打包插件,需要熟悉 Python 虚拟环境和打包机制。
结语
本文介绍了如何使用 Serverless Framework 进行神经网络训练实践,并分享了一些经验和注意事项。希望可以对读者有所帮助。完整代码请参考 GitHub 仓库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d935e9a941bf71340c0353