在Golang app服务器中重新加载tensorflow模型

时间:2017-09-26 13:14:52

标签: go tensorflow

我有一个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,
    )

1 个答案:

答案 0 :(得分:0)

推测destroyTFModel需要很长时间。你可以试试这个:

old := TensorModel

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

go destroyTFModel(old)

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

不要使用if err == nil {围绕它,考虑返回错误。