2017-12-16 7 views
0

나는 10 개의 모델을 가지고이 모델들을 앙상블 화하고자합니다. 매우 빠른 응답 시간으로 추론해야합니다. 일을앙상블 모델의 추론 시간을 향상시키는 방법

container[i]->predict(input, pred); 

로 :로

std::vector<std::thread> threads; 
for (int i = 0; i < n_models; ++i) { 
    threads.emplace_back(std::thread(&Search::make_infer, this, 
            std::ref(container[i]), 
            std::ref(input), 
            std::ref(pred_2d[i]))); 
} 

을 그리고 Search::make_infer가 정의된다

// model containder 
std::vector<std::shared_ptr<LRModel>> container; 

// predictions, n_models = 10 
std::vector<std::vector<std::string>> pred_2d(n_models); 

가 그럼 난 동시에 예측을 위해 스레드 풀을 사용

은 우선은 컨테이너를 정의 응답 시간이 80ms에서 40ms로 단축되었습니다. 그러나 여전히 만족스럽지 못합니다. 시간을 10ms로 줄여야합니다. 이것을 어떻게 더 최적화 할 수 있습니까?

+0

'입력'이란 무엇입니까? 다른 데이터는 각 스레드 (인덱스)에 대해 독립적 인 것처럼 보이지만이 스레드는 공유되는 것으로 보입니다. 그 데이터는 읽기 전용이고 메모리에 있습니까? 또한 실제로는 메모리 액세스 패턴에 따라 캐싱 문제로 인해 성능에 큰 영향을 줄 수 있으므로 모든 데이터가 첫 번째 수준의 캐시에 들어 가지 않으면 더 많은 스레드가 반드시 성능을 향상시키지 않습니다. 실제로 성능은 많은 요소에 따라 달라 지므로 일반적인 조언을하는 것은 어렵습니다. 또한 성능은 코어의 수, CPU의 캐시 크기 등에 따라 달라질 수 있습니다 ... 가장 좋은 점은 프로파일 링과 비교하는 것입니다 ... – Phil1970

+0

@ Phil1970'input'은 RPC의 '벡터 '입니다 의뢰."모든 데이터가 첫 번째 레벨 캐시에 맞지 않는지 이해하지 못합니다 ..."? 실제로 모든 데이터를 1 차 캐시에 넣을 수 있습니까? – fishiwhj

답변

1

일반적인 규칙은 측정 값입니다. 그런 다음 측정 값을 좀 더 늘리십시오. 따라서 도구를 사용하여 시간이 어디로가는 지 측정하십시오. 그러나 당신이 항상주의해야 할 몇 가지 것들이 여전히 있습니다.

모든 데이터가 이미 메모리에있는 경우 Generel 규칙은 하드웨어 스레드보다 많은 스레드를 생성하지 않고 각 스레드가 둘 이상의 검색을 처리하도록해야합니다. 태스크 스위치는 얼마나 운이 좋은지에 따라 약 1000 사이클에서 20000ns까지 걸립니다.

또한 스레드를 만들면 무료가 아니므로 CPU에 여분의 스레드를 사용할 수 없다면 거기에 비트를 저장할 수 있습니다.이 스레드를 여러 번 실행하면 스레드 풀을 사용할 수 있습니다.

데이터가 메모리에없는 경우 이미 다른 스레드가 일부 스레드처럼 도움이 될 수 있으므로 다른 처리를 진행하는 동안 기다릴 수 있습니다.

다음은 공유 데이터의 양을 줄입니다. 귀하의 경우에는 컨테이너에 대한 액세스 만있는 것으로 보입니다. 귀하의 3 std::ref 각각에 대해 한 번만 액세스하면 문제가 될 수는 없지만 실제로는 predict의 내용을 볼 수 없습니다. vector에서 읽는 경우에만 문제가 적습니다.

predict은 같은 시간이 걸리고 각 최소 실행 시간을 하나 개의 하드웨어 스레드가없는 경우는

time = time(predict)*num_predict/num_hardware_threads 

입니다 그리고 런타임은 느린 소프트웨어/하드웨어 스레드 조합, 작업 전환에 의해 제한된다 , 시스템 호출, 참/거짓 공유 등이 개별 런타임에 영향을줍니다.

std::ref을 사용하면 데이터가 참고 자료로 사용 가능한 것 같습니다.

입력 매개 변수를 변경하지 않으려면 const 버전을 매개 변수로 사용해야합니다.