【问题标题】:Reload tensorflow model in Golang app server在 Golang 应用服务器中重新加载 tensorflow 模型
【发布时间】: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


【解决方案1】:

大概destroyTFModel需要很长时间。你可以试试这个:

old := TensorModel

ModelLoadMutex.Lock()
TensorModel = new
ModelLoadMutex.Unlock()

go destroyTFModel(old)

如果需要清理资源并且不知何故需要很长时间阻止此响应,请在分配后销毁和/或尝试在另一个 goroutine 上销毁。我会调查你在 destroyTFModel 中所做的事情以及为什么它很慢,它是向数据库发出网络请求还是涉及文件系统?您确定在您的应用程序外部没有其他您不知道的锁(例如,如果它必须打开一个文件并在销毁此模型时锁定它以供读取?)。

不要在它周围使用 if err == nil { ,而是考虑在错误时返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多