我有一个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,
)
答案 0 :(得分:0)
推测destroyTFModel需要很长时间。你可以试试这个:
old := TensorModel
ModelLoadMutex.Lock()
TensorModel = new
ModelLoadMutex.Unlock()
go destroyTFModel(old)
如果它需要清理资源并且以某种方式需要很长时间阻止此响应,那么在分配之后销毁和/或尝试销毁另一个goroutine。我会查看你在destroyTFModel中做了什么以及为什么它很慢,它是否向数据库发出网络请求或涉及文件系统?您确定您的应用程序外部没有其他锁定您不知道(例如,在销毁此模型时是否必须打开文件并将其锁定以进行读取?)。
不要使用if err == nil {围绕它,考虑返回错误。