使用Google AI平台请求将简单日志写入云存储桶

时间:2020-03-07 19:16:52

标签: google-cloud-platform google-cloud-ml gcp-ai-platform-training

在GCP ai平台中,除了保存tf.keras模型之外,我还尝试将简单的日志写入文件。但是,使用const express = require('express') const http = require('http') const appConfig = require('./config/appConfig') const fs = require('fs') const mongoose = require('mongoose') const cookieParser = require('cookie-parser') const bodyParser = require('body-parser') const globalErrorMiddleware = require ('./app/middlewares/appErrorHandler'); const routeLoggerMiddleware = require('./app/middlewares/routeLogger'); const logger = require('./app/libs/loggerLib'); //declaring an instance or creating an application instance const app = express() //middlewares app.use(bodyParser.json()) //bodyParser app.use(bodyParser.urlencoded({ extended: false })) app.use(cookieParser()) app.use('/uploads', express.static('uploads')) app.use(globalErrorMiddleware.globalErrorHandler); app.use(routeLoggerMiddleware.logIp); // Bootstrap models let modelsPath = './app/models' fs.readdirSync(modelsPath).forEach(function (file) { if (~file.indexOf('.js')) { console.log(file) require(modelsPath + '/' + file) } }) // end Bootstrap models // Bootstrap route let routesPath = './app/routes' fs.readdirSync(routesPath).forEach(function (file) { if (~file.indexOf('.js')) { console.log("including the following file"); console.log(routesPath + '/' + file) let route = require(routesPath + '/' + file); route.setRouter(app); } });// end bootstrap route app.use(globalErrorMiddleware.globalNotFoundHandler); //listening the server - creating a local server const server = http.createServer(app) // start listening to http server console.log(appConfig) server.listen(appConfig.port) server.on('error', onError) server.on('listening', onListening) function onError(error) { if (error.syscall !== 'listen') { logger.error(error.code + ' not equal listen', 'serverOnErrorHandler', 10) throw error } // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': logger.error(error.code + ':elavated privileges required', 'serverOnErrorHandler', 10) process.exit(1) break case 'EADDRINUSE': logger.error(error.code + ':port is already in use.', 'serverOnErrorHandler', 10) process.exit(1) break default: logger.error(error.code + ':some unknown error occured', 'serverOnErrorHandler', 10) throw error } } //end of On Error function onListening() { var addr = server.address() var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; ('Listening on ' + bind) logger.info('server listening on port' + addr.port, 'serverOnListeningHandler', 10) let db = mongoose.connect(appConfig.db.uri, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true }) //end of onListening} process.on('unhandledRejection', (reason, p) => { console.log('Unhandled Rejection at: Promise', p, 'reason:', reason) // application specific logging, throwing an error, or other logic here }) // handling mongoose connection error mongoose.connection.on('error', function (err) { console.log('database connection error'); console.log(err) }); // end mongoose connection error // handling mongoose success event mongoose.connection.on('open', function (err) { if (err) { console.log("database error"); console.log(err); } else { console.log("database connection open success"); }}); // end mongoose connection open handler 保存模型是可行的,而使用tf.saved_model.save写入.txt则不能,并且会引起以下问题:

with open(file) as out:

任何人都可以解释AI平台发现文件路径的方式有何不同吗?

我的请求本质上是这样的(请参见https://cloud.google.com/ai-platform/docs/getting-started-keras

FileNotFoundError: [Errno 2] No such file or directory: 'gs://my-test-bucket-001/keras-job-dir/mnist_model_export/results.txt'

trainer / task.py脚本的相关部分是这样的:

...
JOB_DIR = gs://my-test-bucket-001/keras-job-dir
gcloud ai-platform jobs submit training $JOB_NAME \ 
 --package-path trainer/  \
 --module-name trainer.task  \
 --region $REGION  \
 --python-version 3.7  \
 --runtime-version 2.1  \
 --job-dir $JOB_DIR  \
 --stream-logs

1 个答案:

答案 0 :(得分:0)

使用with open(os.path.join(export_path, 'results.txt'), 'a+') as out:时 您正在使用 local 文件系统,并且由于您通过export_path传递了gs://路径,因此该文件返回的文件不存在,因为gs://路径不可用本地。您需要使用支持读取/写入GCS存储桶的文件处理程序。例如FileIO

替换:

 with open(os.path.join(export_path, 'results.txt'), 'a+') as out:
      log_str = "Job finished! {}\n".format(time.strftime('%Y-%m-%d %H:%M:%S'))
      out.write(log_str)

使用:

from tensorflow.python.lib.io import file_io
with file_io.FileIO(os.path.join(export_path, 'results.txt'), mode='a+') as out:
      log_str = "Job finished! {}\n".format(time.strftime('%Y-%m-%d %H:%M:%S'))
      out.write(log_str)

您可能想查看其他“日志记录”选项available