Skip to content

perf(predicator): PredicatorExtractor 멀티프로세싱 지원 - #170

Merged
lovit merged 5 commits into
refactor-2026from
feature/163
Mar 9, 2026
Merged

perf(predicator): PredicatorExtractor 멀티프로세싱 지원#170
lovit merged 5 commits into
refactor-2026from
feature/163

Conversation

@lovit

@lovit lovit commented Mar 8, 2026

Copy link
Copy Markdown
Owner

개요

Closes #163

PredicatorExtractor.train()n_workers 파라미터를 추가하고, EojeolCounter 집계 단계를 병렬화합니다.

의존 관계

변경 내용

soynlp/utils/utils.py

  • _count_eojeol_chunk(): preprocess 인자 추가 — module-level 함수이면 worker에서 직접 적용
  • EojeolCounter.__init__: _parallel_preprocess 속성 도입 — pickle 가능 여부 자동 판단
  • _counting_from_sents(): pickle 가능한 custom preprocess도 병렬 경로 허용
  • _counting_from_sents_parallel(): preprocess 파라미터 전달

soynlp/predicator/predicator.py

  • train_extract(), train(), _train_with_sentences()n_workers=1 파라미터 추가
  • EojeolCounter 생성 시 n_workers pass-through
  • ensure_normalized=False(기본값) 시 normalize_sent_for_lrgraph(module-level 함수)가 worker에서 실행됨
  • ensure_normalized=True 시 lambda 사용 → pickle 불가 → 단일 프로세스 폴백

tests/unit/test_predicator.py

  • TestPredicatorExtractorMultiprocessing 클래스 추가
    • n_workers=4 수용 테스트
    • 멀티/단일 EojeolCounter 결과 동일성 검증

lovit and others added 3 commits March 9, 2026 05:41
- EojeolCounter.__init__에 n_workers 파라미터 추가 (기본값 1)
- _count_eojeol_chunk(): 모듈 레벨 worker 함수 (pickle 가능)
- _counting_from_sents_parallel(): multiprocessing.Pool로 청크별 병렬 집계 후 병합
- custom preprocess 사용 시 n_workers 무시하고 단일 프로세스 폴백
- n_workers=-1이면 cpu_count() 자동 사용
- 테스트 3개 추가: 멀티/단일 결과 동일성, auto workers, min_count 필터

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
함수명에 의존하는 취약한 체크 방식을 _has_custom_preprocess 플래그로 대체

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _count_eojeol_chunk(): preprocess 인자(4번째) 추가
- EojeolCounter.__init__: _parallel_preprocess 속성 추가 (pickle 가능 여부 검사)
- _counting_from_sents(): picklable custom preprocess도 병렬 처리 가능하도록 dispatch 로직 수정
- _counting_from_sents_parallel(): preprocess 파라미터 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
lovit and others added 2 commits March 9, 2026 07:01
EojeolCounter의 n_workers 지원(#162)을 활용하여 PredicatorExtractor에
멀티프로세싱을 추가. 아울러 EojeolCounter를 picklable 함수를 병렬 경로에서도
활용할 수 있도록 개선.

- utils/utils.py
  - _count_eojeol_chunk(): preprocess 인자 추가 (None이면 무적용)
  - _parallel_preprocess 속성으로 pickle 가능 여부 판단
  - _counting_from_sents_parallel(): preprocess 파라미터 전달 지원
- predicator/predicator.py
  - train_extract(), train(), _train_with_sentences()에 n_workers=1 파라미터 추가
  - EojeolCounter 생성 시 n_workers pass-through
- tests/unit/test_predicator.py
  - n_workers=4 수용 테스트
  - 멀티/단일 EojeolCounter 결과 동일성 테스트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feature/162 rebase 시 conflict 해결 과정에서
EojeolCounter.__init__의 _has_custom_preprocess 초기화 라인이 빠짐.
_counting_from_sents에서 해당 속성 참조 시 AttributeError 발생하던 문제 수정.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@lovit lovit left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 결과: 수정 완료

발견된 이슈:

  1. _counting_from_sents에서 self.preprocess.__name__ == "base_preprocessing" 방식은 취약 — 사용자가 동일한 이름의 함수를 정의하거나, Python 내부적으로 이름이 바뀔 경우 잘못 동작할 수 있음
  2. utils.py가 PR #169와 충돌 — feature/162의 구현이 변경되면 두 PR이 같은 라인을 다르게 수정함

수정 내용:

  • feature/162 (PR #169) 수정: preprocess 지원 완전한 구현으로 업데이트 후 동일한 인터페이스 맞춤
  • feature/163 rebase onto feature/162: utils.py 변경이 #169에 포함되도록 정리
  • conflict 해결: __name__ 비교 대신 _has_custom_preprocess 플래그로 교체
  • rebase 과정에서 누락된 _has_custom_preprocess 초기화 추가 (aff3063)

@lovit
lovit merged commit 1fb5b73 into refactor-2026 Mar 9, 2026
2 checks passed
@lovit
lovit deleted the feature/163 branch March 9, 2026 18:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant