답변

3

아니요, scikit-learn은 GIL로 어떤 트릭도 재생하지 않습니다. 대신 모든 병렬 처리에 joblib을 사용합니다.이 프로세스는 여러 프로세스가 작업을 수행하도록 만듭니다. 커스텀 joblib Parallel 구조로 원하는 것을 얻을 수 있습니다.

다른 설정으로 동일한 데이터 세트에서 여러 분류자를 훈련시켜 최적의 설정을 찾는 경우 병렬 처리를 처리하는 GridSearchCV 클래스를 사용하는 것이 좋습니다.

+0

귀하의 의견을 주셔서 감사합니다, 불행히도 문제가 실제로 다른 스레드 (큰 응용 프로그램의 다른 부분과의 호환성을 위해)를 사용하는 병렬 처리를위한 외부 라이브러리에 의존해야하기 때문에 실제로 해결되지 않습니다. 그래서 나는 GIL ..을 풀어주는 svm을위한 대체 라이브러리를 찾고 싶다. 또는 그것을하기 위해 scikits.learn을 트릭한다. 어쩌면 제안이 있습니까? –

+1

하위 프로세스에서 scikit-learn 코드를 실행하고자 할 수 있습니다. 생성 된 분류기는 피클 링 될 수 있으므로 프로세스간에 쉽게 전송할 수 있습니다. 유일한 문제는 효과적인 방법으로 (아마도 파일 시스템을 통해) 교육 데이터를 전송하는 것입니다. –

+1

또한 libsvm 래퍼는 [Cython] (http://cython.org)으로 작성되었습니다. 래퍼 코드를 [GIL 릴리즈] (http://docs.cython.org/src/userguide/external_C_code.html#acquiring-and-releasing-the-gil)에 패치하는 것은 매우 간단해야한다고 생각합니다. 그렇게하고 문제가 해결되면 github에 대한 풀 요청으로 변경 사항을 제출하십시오. 또한 scikit-learn estimators는 스레드로부터 안전하지 않으므로주의해야합니다. 스레드간에 무시 무시한 평가자 인스턴스를 사용하십시오. – ogrisel

2

일부 sklearn Cython 클래스는 0.15 (2014 년 초에 릴리스 될 예정) 및 libsvm 래퍼와 같이 의사 결정 트리 (예 : 임의의 포리스트에서 사용됨)와 같이 성능 중요 섹션에서 GIL을 내부적으로 릴리스합니다.

이것은 일반적인 규칙은 아닙니다. GIL을 공개하기 위해 변경할 수있는 sklearn의 성능이 중요한 cython 코드를 식별한다면 자유롭게 pull 요청을 보내주십시오.