Computer Science/Python

[sklearn] cython 코드 수정하기

Taewon Heo 2020. 8. 27. 19:29

[sklearn] cython 코드 수정하기

 

sklearn 패키지의 일부 알고리즘은 속도를 위해 c언어 기반의 python으로 작성되어있다.

일반적으로 이 수준의 알고리즘을 변경할 일이 거의 없어서 그런지 site-package에 있는 코드는 이미 컴파일이 된 상태라서 수정이 불가능했다. 환경은 ubuntu이고 python은 3.8에서 테스트하였다.

 

수정을 하기 위해서는

1. sklearn 의 깃 저장소에서 컴파일되지 않은 코드 _cd_fast.pyx 파일을 다운받는다.

2. 컴파일된 파일과 같은 경로에 추가한다.

3. _cd_fast.pyx 를 입맛대로 바꿔서 다시 컴파일한다.

 

3. 의 과정을 자세히 설명하자면,

우선, pyx 파일을 컴파일하기 위해 cython이 설치되어 있어야한다.

그리고 setup.py 파일을 만들어 pyx 파일을 컴파일하는 코드를 추가해야한다.

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

이 코드를 실행시키는 코드는 아래와 같으며, cython 문서를 참조하면 된다.

python setup.py build_ext --inplace

 

코드 수정 과정에서 발생한 에러와 해결방법은 아래와 같다.

 

not allowed without gil error

cython에서는 gil (global interpreter lock) 이라는 cpu processing 방식이 존재하는데 코드 중 with nogil 이 있는곳에 코드를 임의로 수정하는 경우 아래와 같은 에러가 발생할 수 있다. 이 경우 with nogil의 코드블럭을 주석처리하면 에러가 사라진다. 

 

gcc failed with exit status 1

컴파일 과정에서 꽤 자주 발생할 것 같은 에러이다. gcc가 설치 되어있다는 가정하에 아래와 같은 에러가 뜬다면 코드를 추가하여 해결할 수 있다.

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("_cd_fast.pyx")
)

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

include_dirs=[numpy.get_include()]를 추가하면 에러를 해결할 수 있다.