在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
答案 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。