【发布时间】:2018-03-07 17:53:18
【问题描述】:
我有一个 Golang 应用服务器,我在其中每 15 分钟重新加载一个保存的 tensorflow 模型。每个使用 tensorflow 模型的 api 调用都会获取一个读互斥锁,并且每当我重新加载模型时,我都会获取一个写锁。功能方面,这工作正常,但在模型加载期间,我的 API 响应时间会随着请求线程继续等待写锁被释放而增加。您能否建议一种更好的方法来使加载的模型保持最新?
编辑,更新代码
模型加载代码:
tags := []string{"serve"}
// load from updated saved model
var m *tensorflow.SavedModel
var err error
m, err = tensorflow.LoadSavedModel("/path/to/model", tags, nil)
if err != nil {
log.Errorf("Exception caught while reloading saved model %v", err)
destroyTFModel(m)
}
if err == nil {
ModelLoadMutex.Lock()
defer ModelLoadMutex.Unlock()
// destroy existing model
destroyTFModel(TensorModel)
TensorModel = m
}
模型使用代码(部分API请求):
config.ModelLoadMutex.RLock()
defer config.ModelLoadMutex.RUnlock()
scoreTensorList, err = TensorModel.Session.Run(map[tensorflow.Output]*tensorflow.Tensor{
UserOp.Output(0): uT,
DataOp.Output(0): nT},
[]tensorflow.Output{config.SumOp.Output(0)},
nil,
)
【问题讨论】:
-
请编辑您的问题添加代码
-
为什么必须每 15 分钟重新加载一次模型?你不能让它加载到内存中并在需要时使用它吗?
-
模型正在持续训练中。我们需要能够在可用时使用最新模型。这就是为什么这个黑客。这是我们第一次尝试在生产环境中尝试 tensorflow,所以我们可能会犯新手错误。自从我提出这个问题以来,我们还探索了似乎最适合手头任务的 tensorflow-serve。
-
我想办法是训练模型并在每次训练完成时使用不同的标签导出它。然后从 Go 检查当前加载的模型是否有不同的标签,在这种情况下,将其加载到内存中。我猜。你的实际解决方案是什么?
-
对延迟回复表示歉意。正如我在之前的评论中提到的,我们已经转向 tensorflow-serve。它管理模型的生命周期,在本地文件系统上可用时加载新模型,并在新模型可用时卸载旧模型。我们面临的唯一问题是模型的加载/卸载。因此,这对我们来说工作得很好,而且使用的内存/存储也更少。
标签: go tensorflow