2017-11-27 7 views
0

기계 학습자를 양성하기 위해 다중 처리 풀을 사용하고 있습니다.SystemError : NULL result 다중 처리 Python

각 LearnerRun 객체는 학습자, 하이퍼 매개 변수 사전, 이름, 다른 옵션 사전의 몇 가지 옵션, 결과를 작성할 디렉토리 이름, 훈련 할 예제 세트 ID (슬라이스 또는 numpy 배열) 및 테스트 할 예제 ID 집합 (슬라이스 또는 numpy 배열)이 포함됩니다. 중요하게도, 훈련 및 테스트 데이터는 아직 읽혀지지 않습니다. ID 집합은 상대적으로 작고 나중에 함수의 데이터베이스 읽기 동작을 지시합니다.

이전에는 문제가 없었던 self.pool.apply_async(learner_run.run)으로 전화합니다. 이제 풀은로드 된 것처럼 보이지만 run() 함수의 맨 위에있는 print 문은 인쇄되지 않으므로 프로세스가 실제로 실행되지 않습니다.

나는 다른 스레드이 약을 추적하고 내가 handler.get() 다음 handler = self.pool.apply_async(learner_run.run)보다 구체적으로 문제를 볼 수있는 것으로 나타났습니다. 이것은 "SystemError : PyObject_Call에서 오류없이 NULL 결과"를 인쇄합니다.

위대한, 내가 할 수있는 구글. 그러나 멀티 프로세싱과 관련하여이 문제를 발견 할 수있는 이유는 인수가 너무 커서 인수를 하위 프로세스로 전달할 때 발생할 수 있기 때문입니다. 그러나, 나는 분명히 내 하위 프로세스에 인수를 전달하지 않습니다. 그래서 무엇을 제공합니까?

할당 메모리 크기를 초과하는 인수를 제외하고 - 여기서는 문제가 아니라고 확신하지만 - apply_async가 null 결과를 초래할 수 있습니까?

다시 휴가를 떠나기 전에이 작업이 변경되어 변경되지 않았습니다. 다른 코드의 변경으로 인해 작동이 멈출 수 있습니까? enter image description here

내가 그렇게 실행이 오류를 중지하지 않습니다 핸들러에서 get()하려고하지 않는 경우

는, 메모리 사용량이 이상한 패턴을 따른다.

답변

0

그래, 문제가 발견되었습니다. 사실, LearnerRun 은 다중 처리가 처리하기에는 너무 큰이었습니다. 그러나 그것이 있었던 방법은 꽤 미묘하다. 그래서 나는 설명 할 것이다.

분명히 절인해야 할 인수가 아닙니다. 해당 함수가 실행될 LearnerRun 개체 (self)를 포함하여 피클링됩니다.

LearnerRun의 생성자는 전달 된 옵션 사전의 모든 항목을 가져 와서 setattr을 사용하여 모든 키와 값을 값이있는 멤버 변수로 바꿉니다. 이것만으로도 문제가 없지만 제 동료는 데이터베이스 참조가 필요하며 보통 self.trainDatabase = LarData(self.trainDatabase)self.coverageDatabase = LarData(self.coverageDatabase)으로 설정해야하는 문자열을 남겨 놓았음을 알았습니다.

을 제외하고 이것은 피클을 사용하면 데이터베이스 전체를 피클해야한다는 의미입니다! pickle.dumps(learner_run)으로 어떤 일이 일어날 지 알기 위해 LearnerRun 자체를 직렬화 한 온 전성 검사 중에 이것을 발견했습니다. 내 기억이 넘치게되었고 스왑은 놀라 울 정도로 빨리 채워지기 시작했습니다 stackoverflow.

그럼 산 세척은 어떨까요?pickle.dump(learner_run, filename)도 폭발했습니다. 내가 끝내기 전에 그것은 14.3 GiB에 도착했다!

나중에 이러한 참조를 제거하고 필요할 때 LarData 생성자를 호출하는 방법은 무엇입니까? Bam. 결정된. 모든 것이 작동합니다. 멀티 프로세싱은 신비로운 SystemError를 더 이상 제공하지 않습니다.

이것은 내가 최근에 큰 고통을 초래 한 second time 피클입니다.