konlpy X m1 silicon - hexists/konlpy GitHub Wiki

konlpy X m1 silicon

배경

konlpy를 m1 silicon에서 사용하는 방법입니다.
m1은 2020년 11월에 출시된 cpu로 해당 cpu를 사용하는 컴퓨터(mac m1 silicon)에서는 konlpy가 제대로 실행되지 않습니다.
konlpy의 문제보다는 konlpy에서 java package를 불러오는데 이때 jdk 호환성 문제가 있습니다.
본 글에서는 호환성 문제가 해결된 jdk를 사용하여 konlpy를 사용하는 방법에 대해 정리합니다.

설치 방법

기존의 konlpy를 설치했던 방법대로 진행합니다.
konlpy_install_mac.png

원본 링크의 명령어입니다.

# update pip
$ python3 -m pip install --upgrade pip

# install konlpy
$ python3 -m pip install konlpy        # Python 3.x

# install mecab
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

virtualenv로 가상환경을 설정하고 설치하는 내용입니다.

$ python3 -V
Python 3.8.2

$ mkdir test_konlpy_m1

$ cd test_konlpy_m1

$ virtualenv -p python3 .venv

$ source .venv/bin/activate

$ python3 -m pip install --upgrade pip

$ python3 -m pip install konlpy        # Python 3.x

$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

큰 문제가 없다면 설치가 잘됩니다.

테스트

kkma를 실행을 통해, Konlpy가 잘 설치됐는지 확인해봅니다.

>>> from konlpy.tag import Kkma
>>> from konlpy.utils import pprint
>>> kkma = Kkma()
>>> pprint(kkma.pos(u'오류보고는 실행환경, 에러메세지와함께 설명을 최대한상세히!^^'))

실행이 잘되면 좋겠지만, 아래와 같은 오류가 발생합니다.

tweepy 문제
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/konlpy/__init__.py", line 12, in <module>
    from konlpy import (
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/konlpy/stream/__init__.py", line 8, in <module>
    from konlpy.stream.twitter import TwitterStreamer
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/konlpy/stream/twitter.py", line 17, in <module>
    class CorpusListener(tweepy.StreamListener):
AttributeError: module 'tweepy' has no attribute 'StreamListener'
>>>

tweepy 버전 문제로 1.4.0이 설치된 경우 konlpy에서 요구하는 버전(tweepy 3.7.0<= <3.10.0)으로 재설치하면 됩니다.

$ pip install tweepy>=3.7.0,3.10.0

참고로 tweepy 관련된 내용은 konlpy master branch에 이미 제거된 코드로, pypi 패키지를 사용할 때 나타나는 문제입니다. https://github.com/konlpy/konlpy/issues/368

jdk

tweepy 문제를 해결하면 나타나는 오류입니다.
m1 silicon 호환성이 해결되지 않은 jdk를 사용할 때 나타나며, libjli.dylib에서 jvm dll을 찾지 못한다는 메세지를 출력합니다.

python
Python 3.8.2 (default, Dec 21 2020, 15:06:03)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
>>> kkma = Kkma()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/konlpy/tag/_kkma.py", line 95, in __init__
    jvm.init_jvm(jvmpath, max_heap_size)
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/konlpy/jvm.py", line 64, in init_jvm
    jpype.startJVM(jvmpath, '-Djava.class.path=%s' % classpath,
  File "/Users/daniellee/Develop/test_konlpy_m1/.venv/lib/python3.8/site-packages/jpype/_core.py", line 226, in startJVM
    _jpype.startup(jvmpath, tuple(args),
OSError: [Errno 0] JVM DLL not found: /Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home/lib/libjli.dylib

이 문제를 해결하기 위해서는 m1 silicon이 호환되는 jdk를 찾아 설치해야 합니다.
여러 시도 끝에 oracle jdk 17에서 문제 없이 실행되는 것을 확인했습니다.

  1. jdk 다운로드
    oracle jdk download 사이트에서 macOS에서 arm64용 jdk를 다운로드 합니다.
    저는 Arm 64 Compressed Archive를 다운로드 했습니다.
    oracle jdk download
    konlpy_jdk.png

  2. 압축 해제 다운 받은 경로로 이동하여 다운로드 받은 파일을 압축 해제 합니다. konlpy_jdk_tgz.png

  3. 이동(편한 경로에 위치) jdk-17.jdk 디렉토리를 적절한 위치로 이동합니다.
    저는 /Library/Java/JavaVirtualMachines/으로 이동했습니다.

  4. .zshrc 설정
    .zshrc에 환경 설정을 합니다.

$ echo "export JAVA_HOME_17=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home" >> ~/.zshrc
$ echo "export JAVA_HOME=$JAVA_HOME_17" >> ~/.zshrc
$ echo "export PATH=$PATH:$JAVA_HOME/bin" >> ~/.zshrc

.zshrc를 현재 환경에 적용하기 위해 아래 명령어를 실행합니다.

$ source ~/.zshrc

모든 오류 수정 후 실행

모든 오류를 수정한 다음에는 오류 메세지 없이 konlpy가 잘 실행되는 것을 확인할 수 있습니다.

>>> from konlpy.tag import Kkma
>>> from konlpy.utils import pprint
>>> kkma = Kkma()

>>> pprint(kkma.pos(u'오류보고는 실행환경, 에러메세지와함께 설명을 최대한상세히!^^'))
[('오류', 'NNG'),
 ('보고', 'NNG'),
 ('는', 'JX'),
 ('실행', 'NNG'),
 ('환경', 'NNG'),
 (',', 'SP'),
 ('에러', 'NNG'),
 ('메세지', 'NNG'),
 ('와', 'JKM'),
 ('함께', 'MAG'),
 ('설명', 'NNG'),
 ('을', 'JKO'),
 ('최대한', 'NNG'),
 ('상세히', 'MAG'),
 ('!', 'SF'),
 ('^^', 'EMO')]

Reference

Issues

⚠️ **GitHub.com Fallback** ⚠️