2017-09-26 1 views
0

15 분마다 저장된 텐서 흐름 모델을 다시로드하는 Golang 앱 서버가 있습니다. tensorflow 모델을 사용하는 모든 API 호출은 읽기 뮤텍스 잠금을 사용하고 모델을 다시로드 할 때마다 쓰기 잠금을 사용합니다. 기능상 현명하게도 잘 작동하지만 모델로드 중에는 요청 스레드가 쓰기 잠금이 해제되기를 기다리는 동안 API 응답 시간이 길어집니다. 로드 된 모델을 최신 상태로 유지하는 더 나은 방법을 제안 해 주시겠습니까?Golang 앱 서버에서 리로드 텐서 흐름 모델

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

질문을 수정하십시오 ** 코드 ** – nessuno

+0

15 분마다 모델을 다시로드해야하는 이유는 무엇입니까? 그냥 메모리에로드하여 필요할 때 사용할 수는 없습니까? – nessuno

+0

모델이 지속적으로 교육되고 있습니다. 그리고 최신 모델을 언제든지 사용할 수 있어야합니다. Thats 왜이 해킹. 이것은 생산 환경에서 텐서 흐름을 시도한 첫 번째 시도이므로 신참 실수를 저지르고있을 수도 있습니다. 내가이 질문을 한 이래로, 우리는 또한 현재 진행중인 과제에 가장 적합한 것으로 보이는 텐서 플로우 - 서브를 탐구했다. – zingler

답변

0

아마도 destroyTFModel 시간이 오래 걸리는

편집, 코드

모델로드 코드 업데이트. 당신이 시도 할 수 :

old := TensorModel 

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

go destroyTFModel(old) 

그래서 할당 후 파괴 및/또는 자원을 정리해야하고 어떻게 든이 응답을 차단 시간이 오래 걸리는 경우 다른 goroutine에 파괴하려고합니다. 나는 당신이 destroyTFModel에서 무엇을하고 있는지, 왜 그것이 느린 지 살펴볼 것입니다. db에 네트워크 요청을하거나 파일 시스템을 포함합니까? 알고 계시지 않는 앱 외부에 다른 잠금 장치가 없는게 확실합니까 (예 : 파일을 열어이 모델을 파괴하는 동안 파일을 잠글 때 잠금 상태가 된 경우)?

대신에 err == nil {if를 사용하는 대신 오류시 다시 돌아가는 것을 고려하십시오.

관련 문제