본문 바로가기

Linux/colab

[Colab]21.02.24자 colab에서 Rdkit 설치안되는 문제해결하기

저는 화학물질데이터를 다루는 일을 하고 있기 때문에 rdkit이라는 python libaray를 자주 사용합니다. 

그런데 어제까지는 colab에서 잘 설치되던 rdkit이 오늘자로 갑자기 설치에 오류가 뜨는 것을 발견했습니다. 아마도 colab이 업데이트 되면서 vm의 설정이 조금 바뀐것 같습니다. 

기존에 colab에서 rdkit을 설치하는 여러가지 방법이 있는데 모두 시도를 해보았지만 잘 되지 않았습니다. 

기존내가 썼던 방법들

# rdkit 2020.03.3 버전 다운로드
!pip install kora -q
import kora.install.rdkit
# rdkit 2020.03.3 버전 다운로드
# !pip install kora -q
# import kora.install.rdkit
import sys
import os
import requests
import subprocess
import shutil
from logging import getLogger, StreamHandler, INFO


logger = getLogger(__name__)
logger.addHandler(StreamHandler())
logger.setLevel(INFO)


def install(
        chunk_size=4096,
        file_name="Miniconda3-latest-Linux-x86_64.sh",
        url_base="https://repo.continuum.io/miniconda/",
        conda_path=os.path.expanduser(os.path.join("~", "miniconda")),
        rdkit_version='2020.03.3',
        add_python_path=True,
        force=False):
    """install rdkit from miniconda
    ```
    import rdkit_installer
    rdkit_installer.install()
    ```
    """

    python_path = os.path.join(
        conda_path,
        "lib",
        "python{0}.{1}".format(*sys.version_info),
        "site-packages",
    )

    if add_python_path and python_path not in sys.path:
        logger.info("add {} to PYTHONPATH".format(python_path))
        sys.path.append(python_path)

    if os.path.isdir(os.path.join(python_path, "rdkit")):
        logger.info("rdkit is already installed")
        if not force:
            return

        logger.info("force re-install")

    url = url_base + file_name
    python_version = "{0}.{1}.{2}".format(*sys.version_info)

    logger.info("python version: {}".format(python_version))

    if os.path.isdir(conda_path):
        logger.warning("remove current miniconda")
        shutil.rmtree(conda_path)
    elif os.path.isfile(conda_path):
        logger.warning("remove {}".format(conda_path))
        os.remove(conda_path)

    logger.info('fetching installer from {}'.format(url))
    res = requests.get(url, stream=True)
    res.raise_for_status()
    with open(file_name, 'wb') as f:
        for chunk in res.iter_content(chunk_size):
            f.write(chunk)
    logger.info('done')

    logger.info('installing miniconda to {}'.format(conda_path))
    subprocess.check_call(["bash", file_name, "-b", "-p", conda_path])
    logger.info('done')

    logger.info("installing rdkit")
    subprocess.check_call([
        os.path.join(conda_path, "bin", "conda"),
        "install",
        "--yes",
        "-c", "rdkit",
        "python=={}".format(python_version),
        "rdkit" if rdkit_version is None else "rdkit=={}".format(rdkit_version)])
    logger.info("done")

    import rdkit
    logger.info("rdkit-{} installation finished!".format(rdkit.__version__))



install()

이걸 사용했을때 이런 에러가 발생했습니다.

CalledProcessError: Command '['/root/miniconda/bin/conda', 'install', '--yes', '-c', 'rdkit', 'python==3.7.10', 'rdkit']' returned non-zero exit status 1.

새로 시도해본 방법

!wget -c https://repo.continuum.io/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh
!chmod +x Miniconda3-py37_4.8.3-Linux-x86_64.sh
!time bash ./Miniconda3-py37_4.8.3-Linux-x86_64.sh -b -f -p /usr/local
!time conda install -q -y -c conda-forge rdkit

import sys
sys.path.append('/usr/local/lib/python3.7/site-packages/')

import rdkit은 되지만

from rdkit.Chem import AllChem는 되지 않고 아래와 같은 에러가 발생했습니다. 

stack overflow에 검색을 하여 여러가지를 시도 해 보았지만. 그래도 여전히 되지 않았습니다.

...

그렇게 하루가 지나고.. 

25일인 오늘 다시 시도를 해 보았습니다.

# rdkit 2020.03.3 버전 다운로드
# !pip install kora -q
# import kora.install.rdkit
import sys
import os
import requests
import subprocess
import shutil
from logging import getLogger, StreamHandler, INFO


logger = getLogger(__name__)
logger.addHandler(StreamHandler())
logger.setLevel(INFO)


def install(
        chunk_size=4096,
        file_name="Miniconda3-latest-Linux-x86_64.sh",
        url_base="https://repo.continuum.io/miniconda/",
        conda_path=os.path.expanduser(os.path.join("~", "miniconda")),
        rdkit_version='2020.03.3',
        add_python_path=True,
        force=False):
    """install rdkit from miniconda
    ```
    import rdkit_installer
    rdkit_installer.install()
    ```
    """

    python_path = os.path.join(
        conda_path,
        "lib",
        "python{0}.{1}".format(*sys.version_info),
        "site-packages",
    )

    if add_python_path and python_path not in sys.path:
        logger.info("add {} to PYTHONPATH".format(python_path))
        sys.path.append(python_path)

    if os.path.isdir(os.path.join(python_path, "rdkit")):
        logger.info("rdkit is already installed")
        if not force:
            return

        logger.info("force re-install")

    url = url_base + file_name
    python_version = "{0}.{1}.{2}".format(*sys.version_info)

    logger.info("python version: {}".format(python_version))

    if os.path.isdir(conda_path):
        logger.warning("remove current miniconda")
        shutil.rmtree(conda_path)
    elif os.path.isfile(conda_path):
        logger.warning("remove {}".format(conda_path))
        os.remove(conda_path)

    logger.info('fetching installer from {}'.format(url))
    res = requests.get(url, stream=True)
    res.raise_for_status()
    with open(file_name, 'wb') as f:
        for chunk in res.iter_content(chunk_size):
            f.write(chunk)
    logger.info('done')

    logger.info('installing miniconda to {}'.format(conda_path))
    subprocess.check_call(["bash", file_name, "-b", "-p", conda_path])
    logger.info('done')

    logger.info("installing rdkit")
    subprocess.check_call([
        os.path.join(conda_path, "bin", "conda"),
        "install",
        "--yes",
        "-c", "rdkit",
        "python=={}".format(python_version),
        "rdkit" if rdkit_version is None else "rdkit=={}".format(rdkit_version)])
    logger.info("done")

    import rdkit
    logger.info("rdkit-{} installation finished!".format(rdkit.__version__))



install()

위 방법으로 계속 시도를 하던 도중 원인을 발견한 것 같습니다.

colab의 현재 python version이 3.7.10인데....(Feb. 15, 2021 realse)

설치된 minconda를 이용하여  rdkit을 설치하려고 했을때 오류메세지를 보니 your python 이 3.8버전이라고 하는 것입니다...

3.7.10이지만 3.8로 인식을 하는것 같고.. 이 버전의 파이썬에서는 rdkit을 설치할 수 없는 것 같습니다.

kaggle notebook에서는 3.7.9버전의 python이였고.. 설치가 잘 되었습니다.

그렇담  현재 python  3.7.10 버전의  colab에서는 rdkit을 사용할 수 없는 것일까요?

두가지 방법이 있을 것 같습니다. 

1. 3.7.10에 rdkit을 설치할 수 있는 방법을 알아본다.  --> 이 방법을 좀더 강구해 보겠습니다.

2. colab의 python version을 downgrade한다. --> 이 방법은 구글링을 해봤지만 불가능한 것으로 생각되어집니다. --> 어쩌면 가능 할 수도 있겠습니다.

stackoverflow.com/questions/60775160/install-python-3-8-kernel-in-google-colaboratory

 

Install Python 3.8 kernel in Google Colaboratory

I try to install a new Python version (3.8) using conda. !wget -O mini.sh https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-x86_64.sh !chmod +x mini.sh !bash ./mini.sh -b -f -p /usr/...

stackoverflow.com

위에서 나온 방법에 3.7을 대입하면 되지 않을까 합니다. -->안되는것 같습니다...

일단 해결하기를 포기하고.. colab이나 rdkit이 update되기를 기다리는 수밖에 없겠네요.

....포기하려고하다가 마지막으로 시도해봤는데... 해결이 되었습니다!!!!!

!/root/miniconda/bin/conda install --yes -c rdkit python==3.7.9 rdkit

python version을 3.7.9로 바꿔주니까... 잘 되네요

결론을 말씀드리면 아래걸로 설치하면 된다는 말입니다!!!!!

import sys
import os
import requests
import subprocess
import shutil
from logging import getLogger, StreamHandler, INFO


logger = getLogger(__name__)
logger.addHandler(StreamHandler())
logger.setLevel(INFO)


def install(
        chunk_size=4096,
        file_name="Miniconda3-latest-Linux-x86_64.sh",
        url_base="https://repo.continuum.io/miniconda/",
        conda_path=os.path.expanduser(os.path.join("~", "miniconda")),
        rdkit_version='2020.03.3',
        add_python_path=True,
        force=False):
    """install rdkit from miniconda
    ```
    import rdkit_installer
    rdkit_installer.install()
    ```
    """

    python_path = os.path.join(
        conda_path,
        "lib",
        "python{0}.{1}".format(*sys.version_info),
        "site-packages",
    )

    if add_python_path and python_path not in sys.path:
        logger.info("add {} to PYTHONPATH".format(python_path))
        sys.path.append(python_path)

    if os.path.isdir(os.path.join(python_path, "rdkit")):
        logger.info("rdkit is already installed")
        if not force:
            return

        logger.info("force re-install")

    url = url_base + file_name
    python_version = "{0}.{1}.{2}".format(*sys.version_info)

    logger.info("python version: {}".format(python_version))

    if os.path.isdir(conda_path):
        logger.warning("remove current miniconda")
        shutil.rmtree(conda_path)
    elif os.path.isfile(conda_path):
        logger.warning("remove {}".format(conda_path))
        os.remove(conda_path)

    logger.info('fetching installer from {}'.format(url))
    res = requests.get(url, stream=True)
    res.raise_for_status()
    with open(file_name, 'wb') as f:
        for chunk in res.iter_content(chunk_size):
            f.write(chunk)
    logger.info('done')

    logger.info('installing miniconda to {}'.format(conda_path))
    subprocess.check_call(["bash", file_name, "-b", "-p", conda_path])
    logger.info('done')

    logger.info("installing rdkit")
    subprocess.check_call([
        os.path.join(conda_path, "bin", "conda"),
        "install",
        "--yes",
        "-c", "rdkit",
        "python==3.7.9",
        "rdkit" if rdkit_version is None else "rdkit=={}".format(rdkit_version)])
    logger.info("done")

    import rdkit
    logger.info("rdkit-{} installation finished!".format(rdkit.__version__))



install()

'Linux > colab' 카테고리의 다른 글

[COLAB] google colab 이란? & 사용법  (0) 2021.03.04