くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

【M1】devcontainerを使った、研究コード開発環境の構築

はじめに

これまで、Pythonをベースとした研究コードを作成する際に、pyenvディレクトリごとにPythonのバージョンや必要なmoduleをinstallして作っていましたが、 共有計算機や別環境で計算を行うことも多く、pyenvがupdateされていて、いい感じに必要なライブラリなどが用意できてないとpyenv install x.x.xといった単順なコマンドがコケることもあり、この際再現性などの観点からもDockerで研究コードを開発するようにしようと思ったのがきっかけです。 (ちなみに、M1のMackBook Proのまっさらな状況で、Homebrewでbrew install pyenvでインストールしてPATH等設定したら挙動することは確認できてますが今回はDockerで環境を作ることに集中します。)

前提

  1. MacのM1チップ用のDocker Desktopを利用
  2. 他の多くの計算環境でも使えるようにデフォルトのARM64イメージではなく、x86-64(AMD64)のイメージで行う
  3. Visual Studio Code](https://code.visualstudio.com/)のdevcontainerを使う(完成物と開発過程のDockerイメージを基本同一で開発したい)

特に最後のdevcontainerの話は、開発物にはformatterやnotebookのモジュールはいらないけれど、開発時にはそのようなモジュールがあると嬉しいみたいなことがあったり、 最近Visual Studio CodeのupdateでRemote - SSHでもdevcontainerを使えるようになったので、ある程度開発が進んでマシーンスペックを上げて共有計算機やクラウドなどで並列計算させたりしつつリモート環境下での開発などの需要のときに、わざわざリモート側で開発物用の環境を作る必要がないということが大きいです。(これまでは、リモートでpyenvやvenvなどを使ってDockerfileのバージョンに合わせ、requirements.txtを使ってほぼ同じ環境っぽい状態にするといった工程が挟まっていたが、それがなくなった。)

code.visualstudio.com

【注】他の共有計算機環境があるならそこにRemote −SSH + devcontainerで開発すればいいのでは?って言うこともありますが、本題は新しいMacのM1チップでどこまでできるのかということを意図しています。共有計算機ないけど、M1 MacBook ProがあってDockerでゴニョゴニョしたいという状況が1番優先される前提です。今後利便性も含め、x86-64環境でビルドしたDocker imageをつかってM1のDockerでコンテナ作成、実行などができるかの検証も今後する予定です。

M1という障壁

その他の記事でも言われていますが、M1でなければそんな面倒でもないですが、ローカルの環境がM1のMacBook Proだとチップの違いによりARM64でビルドされていないPythonモジュールはpip installできません。Dockerでもそれは同じで、Dockerで作られるimageがARM64だと同様の現象が起きます。 有名どころのモジュールは対応してくれていますがそんなたくさんないのでM1 用のDoker Desktopはマルチプラットフォームでimageが作成可能なため、AMD64でimageを作ることで、前述の問題を回避します。さらにそのビルドしたimageはx86-64の環境でそのまま使えるということにも繋がります。

対応策

最終的な形はこちらのGitHub レポジトリを見てもらえば良いと思いますが、要所をまとめます。

Dockerfile

  • 適当にお好みのPython公式のimageを引っ張ってくる。マイナーバージョンまで指定すればビルドタイミングによるバージョン変更など起きない。
  • requirements.txtに研究コードに必要なモジュールをバージョンを指定しておく。
  • WORKDIRはdocker-compose.ymlのservicesに合わせる 。アプリケーション開発だとappとすることが多いので一旦appとしているが適宜変えて良い。
FROM python:3.7.9

COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

WORKDIR /app

まぁシンプルな感じ

docker-compose.yml

Dockerコマンドが開発ディレクトリをマウントしたり、imageのidを参照するなどすると面倒だし、コマンドが長くなるので、docker-composeを使う。そのため、その設定ファイルであるdocker-compose.ymlが必要

  • 最大のポイントはここで platform: linux/amd64としてプラットフォームを指定し、x86-64(AMD64)のimageが作られるようにする。
  • あとは開発ディレクトリをマウントしておく(.とすることで、docker-compose.ymlがある場所をマウントするということになる。)
version: "3.8"
services:
  app:
    build: .
    platform: linux/amd64
    volumes:
      - ./:/app

とりあえずテスト

まずはDockerfileをビルドする。

docker-compose build

とりあえずビルドが終わったら、所定のバージョンがインストールされているか、ご所望のモジュールがインストールされているかなど確認してみる

docker-compose run app python -V
# Python 3.7.9 (Dockerfileで指定したversion)
 docker-compose run app pip list

# Package         Version
# --------------- --------
# click           7.1.2
# numpy           1.21.5
# pandas          1.3.5
# Pillow          8.4.0
# pip             21.0.1
# python-dateutil 2.8.2
# pytz            2021.3
# QEPPI           0.1.11
# rdkit-pypi      2021.9.3
# setuptools      53.0.0
# six             1.16.0
# wheel           0.36.2

コンテナの中に遊んでもいい。

docker-compose exec app bash

とすれば、コンテナの中に入れるのであとは適宜必要に応じて確認などする。

pythonモジュールの作成

なんか適当に開発モジュールを適当に作る。要するにxxxx.py。
今回テスト的に、py4chemoinformaticsを参考にRDKitのMolToGridImageでsildenafilとvardenafilの構造式をプロットしてくれるコードを書きました。(MolToGridImage.py)

github.com

あと、今回の本題とは、ずれますがargparserとしてclickを採用しました。シンプルで結構便利です。

click.palletsprojects.com

モジュールを動かしてみる

docker-compose run app python -m rdkit_MolToGridImage --output ./data --name test --align True

# 上記はargをあえて書いているが、defaultを指定しておけば、
docker-compose run app python -m rdkit_MolToGridImage
でも実行可能

f:id:black_tank_top:20211224140651p:plain
出力結果

単にDockerでPython環境を固定して動かすだけであれば、これで十分だが、Visual Studio Codeのdevcontainerを使って開発したいので、こちらを準備する。

devcontainer

Visual Studio Codeを開いて、左下の><となっているところをクリックして、Add Development Container Configuration Filesっていうのをクリックして、From docker-composeというのを選ぶと、.devcontainerディレクトリができて、devcontainer.jsonとdocker-compose.ymlが生成される。

devcontainer.json

基本自動生成されたままでよいが、使用するPythonは、devcontainerのpythonを指定。/usr/local/bin/pythonで問題ないはず。 今回は、devcontainer上だけで使いたいフォーマッターなどのモジュールをinstallしたり、Visual Studio CodeのExtensionを毎回設定するのは面倒なので、devcontainerを使うときに最初から設定されるようにする。

"settings", "extensions", "postCreateCommand"らへんがそんなところ。

docker-compose.yml

自動生成されたままでOK

詳細はGitHubを参照してもらえばと思います。

devcontainerの起動

上記がおわったら、早速起動してみましょう。左下の><となっているところをクリックして、Open Fold in Containerをクリックすれば、devcontainerがビルドされます。コンテナ作成と追加のモジュールのインストール程度の時間なので、1-2分くらいです。そうすると以下のようになります。

f:id:black_tank_top:20211224142757p:plain
devcontainerが起動したVisual Studio Codeの画面

あとは、よしなにこちらで開発をすすめていけばOKです。

Jupyter Notebookについて

Visual Studio Code.ipynbファイルを読みこんでノートブックとして動かすことが可能で固定された環境でとても便利ですが、上記の経緯で進めた結果、Notebookの実行でM1固有の問題に直面し、Cellを実行すると、

Failed to start the Kernel. 
qemu: uncaught target signal 6 (Aborted) - core dumped. 
View Jupyter log for further details.

となってしまって、実行できませんでした。いろいろ調べましたが現状Jupyter NotebookをVisual Studio Codeで動かすことは、まだ難しそうです。

おわりに

今回は、

  1. MacのM1チップ用のDocker Desktopを利用して、M1のMacでも特定のPython環境にお好みのモジュールをinstallし研究コードを開発する環境構築方法を示しました。
  2. また、docker-composeを使うことで長くなりがちのdockerコマンドを簡略化しました。
  3. docker-composeコマンドを使って、実際のpythonモジュールを動かす方法示しました。
  4. Visual Studio Codeのdevcontainerを使って、完成品の環境と同一のimageを使った状態で開発をすすめる方法を示しました。

残念ながら、Jupyter NotebookをVisual Studio Codeで動かすことができなかったです。今後のupdateを期待したいところです。

【M1】Dockerコマンド補完でハマったのでメモ

はじめに

Apple Silicon (M1)のMacBook ProでDocker Desktopを導入後Dockerコマンドを補完するやり方をこれまでのMacBook Proと同じようにはできなかったので、ドキュメントに書いてある方法などでうまくいかなかった方法や、最終的にできた方法を記します。 ちなみにzsh/bin/zshのものを使っています。

Dockerコマンドの補完機能の設定について

公式にはDocker composeの設定の仕方が書いてある docs.docker.com oh-my-zshは使っていないので、 Without oh-my-zsh shellでのやり方を見ると、

mkdir -p ~/.zsh/completion
 curl \
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/zsh/_docker-compose \
    -o ~/.zsh/completion/_docker-compose

となっているが、このあとの処理を書き加えてもうまく行かない。(結果的にこのcurlしてくるファイルがM1には良くないっぽい)

なんか違う方法はないかと色々調べるとここらへんに行き着く docs.docker.jp

これのM1バージョンで、brewzshのpathに変更してもだめ(M1の場合のPATHは/opt/homebrew/share/zsh/site-functions/

etc=/Applications/Docker.app/Contents/Resources/etc
ln -s $etc/docker.zsh-completion /opt/homebrew/share/zsh/site-functions/_docker
ln -s $etc/docker-compose.zsh-completion /opt/homebrew/share/zsh/site-functions/_docker-compose

とまぁ、色々試した結果、なんだかよくわからんが上記合わせ技で解決。 つまり、1つ目の補完に必要なファイルをcurlで引っ張るのではなく、Docker Desktop for Macに付随している補完スクリプトシンボリックリンクを貼るようにする。

後半はzshの補完機能を有効にするために.zshrcに記述する。 シェルを一度切って、もう一度立ち上げ、docker[半角スペース]としてtabを押せば以下のようになる

% docker
attach     -- Attach local standard input, output, and error streams to a running container
build      -- Build an image from a Dockerfile
builder    -- Manage builds
buildx*    -- Docker Buildx (Docker Inc., v0.7.1)
commit     -- Create a new image from a container's changes
compose*   -- Docker Compose (Docker Inc., v2.2.1)
config     -- Manage Docker configs
container  -- Manage containers
...

docker-compose[半角スペース]としてtabを押せば以下のようになる

% docker-compose
build    -- Build or rebuild services
convert  -- Converts the compose file to platform's canonical format
cp       -- Copy files/folders between a service container and the local filesystem
create   -- Creates containers for a service.
down     -- Stop and remove containers, networks
events   -- Receive real time events from containers.
exec     -- Execute a command in a running container.
images   -- List images used by the created containers
kill     -- Force stop service containers.
logs     -- View output from containers
ls       -- List running compose projects
...

補完できている。これで快適Docker生活

おわりに

まだM1でDockerコマンドの補完について書かれているものは見つからなかったので、同じくハマっている人がいたら参考になればと思います。

国際会議IEEE CIBCB2021の論文がPublishされました。

はじめに

2021/10/18に国際会議IEEE CIBCB2021の論文がPublishされました。

ieeexplore.ieee.org
T. Kosugi and M. Ohue, "Quantitative Estimate of Protein-Protein Interaction Targeting Drug-likeness," 2021 IEEE Conference on Computational Intelligence in Bioinformatics and Computational Biology (CIBCB), 2021, pp. 1-8, doi: 10.1109/CIBCB49929.2021.9562931.

論文概要

タンパク質間相互作用(PPI)は最近注目されている創薬の標的です。薬となる化合物を設計する際に、その化合物がPPIを標的にできそうかどうかの度合いを定量的にスコア化する手法はありませんでした。そこで、化合物がPPIを標的にできそうかどうかを定量的にスコア化する手法を開発したという内容になっています。

先に、拡張版のほうがPublishされているので、こちらの方がより詳細に議論されている内容が盛り込まれています。

www.mdpi.com

拡張版を紹介した過去記事は以下です。

blacktanktop.hatenablog.com

QEPPIのコード

論文で用いられている、低分子化合物のPPIを標的にできそう度合いをスコア化した「QEPPI」はGitHubで公開しています。 https://github.com/ohuelab/QEPPI

github.com

Bio"Pack"athon2021 #10にて発表しました。


f:id:black_tank_top:20211013080956p:plain

はじめに

先日も報告しましたが、最近論文がPublishされました。

Kosugi T, Ohue M. Quantitative Estimate Index for Early-Stage Screening of Compounds Targeting Protein-Protein Interactions. International Journal of Molecular Sciences. 2021; 22(20):10925. https://doi.org/10.3390/ijms222010925

www.mdpi.com

サラッとした説明は昨日も書きました。 blacktanktop.hatenablog.com

今回の研究で、低分子化合物がタンパク質間相互作用(PPI)を標的にできそうかどうかを定量的にスコア化出来るモジュールQEPPIを開発したので、せっかくだからGitHubにあるだけでなく、研究者がさっと使えるように、pip install QEPPIとできるようにPyPIに登録してみました。自身としては初めての試みだったので、色々と調べながらやったことをまとめます。最初は開発モジュールの概要と紹介です。

また、PyPIに登録した後に、@antiplasticsさんからBio"Pack"athon2021 #10へ参加しませんか?ということで誘っていただき、本日発表を行ってきました。

QEPPIとは

タンパク質は、単体で機能するタンパク質もありますが、タンパク質とタンパク質とが相互作用(Protein-Protein interaction (PPI))することで特有の機能をします。(例えば、シグナル伝達・転写因子群による転写など)

近年、医薬品の開発において様々な標的の中で注目されているのがこのPPIです。しかしながら従来の標的(単体のタンパク質のリガンドポケット)とは大きく特性が異なるため、従来の指標ではPPIを標的にできそうかどうかを定量的にスコア化することが困難であることがこれまでの研究で知られており、求められています。

そこで私が所属しているラボで、低分子化合物がPPI(タンパク質間相互作用)を標的にできそうな度合いを定量的にスコア化できるQEPPIを開発しました。

開発について

GitHub上での開発

公開しているコードは、QEPPIを計算するモジュールのみですが、実際の開発では、学習(正確にいうと学習ではないので学習みたいな)コードも書いています。基本となる、QEDという従来医薬品における定量指標の論文に記述されている数式をベースにコードに起こして、作成しました。最終的に推論(これまた、正確に言うと推論ではないが推論みたいな)コードを公開したという経緯になります。

PyPIへの登録

  1. Package化に必要なモジュールのインストール
  2. Packageソースの作成
    1. init.pyの作成
    2. メインソースの作成
    3. MANIFEST.inの作成
    4. setup.pyの作成
    5. README.mdの作成 1 LICENSEの作成
  3. Twineを使ってPyPIに登録

事前準備

基本的に、パッケージ化に必要なsetuptoolsとwheel はinstall済みなことが多いですが、upgradeを行います。また後述しますがPyPIのupload用にtwineというモジュールを使うので、こちらもインストールしておきます。(モジュールの実行環境とは別にPyPIへのupload用にpyenvなどで環境を切り分けてから実行したほうが良いかと思います。)

 python3 -m pip install --upgrade setuptools wheel twine

Packageソースの作成

本題のPyPIの登録についてです。PyPIの登録は今回初めて行いました。ドキュメントはあるものの、ちょっとよくわからないというのが正直なところでした。なのでいろんなサイトを参考にしてやってみました。 基本いくつかのステップに分けられるのでステップに分けて説明します。

# QEPPIの例(本物とちょっと違うけど)
├── setup.py
├── MANIFEST.in
├── QEPPI  ← ここをモジュール名と合わせておくと吉
│   ├── __init__.py
│   ├── QEPPI.py
│   ├── constant.py
│   ├── util.py
│   └── version.py
├── README.md
├── LICENSE
  • setup.py : パッケージ作成情報を記述する。(詳細は後述)
  • MANIFEST.in : パッケージに追加、または除外するファイルを記述する。 例えばrequirements.txtなど。 LICENSE, README.md setup.pyなどは指定せずとも勝手にパッケージングされます。取り除きたい場合はexcludeであえて含ませないといったことが出来ます。また、setup.pyの仕様でrequirements.txtを使う場合はMANIFEST.in に書かないと怒られますので必ず書きましょう。
# MANIFEST.in
include *.md
exclude README.md
include requirements.txt
  • init.py : パッケージ基本情報を記述。 例えば以下のような感じ。 一番上のimportが結構重要です。
# __init__.py
from .<ファイル> import *  ← この行ポイント
__copyright__    = "Copyright (C) 2021 balcktanktop"
__version__      =  "0.1.10"
__license__      = "MIT"
__author__       = "くろたんく"
__author_email__ = "くろたんく@gmail.com"
__url__          = "http://github.com/blacktanktop/repository"
  • setup.py
    一番肝心のsetup.pyです。まず例です。
from setuptools import setup

exec(open("QEPPI/version.py").read())

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setup(
    name="QEPPI",
    version=__version__,
    author="blacktanktop,
    author_email="くろたんく@gmail.com",
    description="Calculation module of QEPPI",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/ohuelab/QEPPI/",
    license="MIT",
    packages=["QEPPI"],
    install_requires=[
        "rdkit-pypi>=2021.3.1.5",
        "numpy>=1.19.5",
        "pandas>=1.1.5",
    ],
    classifiers=[
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
        "Topic :: Scientific/Engineering :: Chemistry",
        "Topic :: Scientific/Engineering :: Bio-Informatics",
    ],
)

name : パッケージ名称
version : バージョン
author : 著作者名
author_email : 著作者のメールアドレス
description : 簡単な説明
long_description : 詳細の説明 後述しますがREADME.mdファイルの内容をそのまま書き込むこともできます。
url : パッケージのWeb page GitHubリポジトリURLなど license : パッケージのライセンス(MITなど)
packages : モジュールリスト (Mainソースのディレクトリ名を指定する) install_requires : Dependencyのあるパッケージ
classifiers : 分類語のリスト 実際にPyPIで分類リストがあるのでそれを指定する。

冒頭の2行は

  • exec(open("QEPPI/version.py").read())
    • とするとverion.pyに書いてあるversion=0.1.10を読み込めるので、バージョンを変数で管理するためです。
with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()
  • long_descriptionという変数にREADME.mdのテキストを突っ込むことで、 PyPIに登録したときの画面をREADME.mdと同じにするための方法です。

また、install_requiresをrequirements.txtで指定したい場合は、

def _requires_from_file(filename):
    return open(filename).read().splitlines()

のような関数を作っておいて

install_requires=_requires_from_file("requirements.txt")

などとします。

ただ、最近ではsetup.pyはシンプルにして、setup.cfgというconfigファイルに全部設定を書くというのが主流だそうです。 参考までに例を上げておきます。(マダよくわかってないがiniファイルっぽい作りのものでsetup()の括弧内のものを別のまとめ方でもできるよということです。)

[metadata]
name = package_name
version = attr: src.VERSION
description = short package description
long_description = file: README.md
keywords = foo, bar
license = MIT License
classifiers =
    Programming Language :: Python :: 3.7

[options]
zip_safe = False
include_package_data = True
packages = find:
scripts =
  bin/first.py
  bin/second.py
install_requires =
  pandas
  numpy; python_version == "3.7"

[options.package_data]
* = *.md

さて、これで下準備ができました!あとはビルドしてPyPIにupするだけです。

ちょっとテスト

ここまで出来ていると、以下のコマンドでinstallテストが可能です。

python setup.py install

pip listすればinstallが確認出来ると思います。

また、versionやその他の定義変数を設定している場合は以下のような確認もできます。

>>> import QEPPI
>>> QEPPI.__version__
'0.1.10'

ビルドの準備

ビルドするには、setuptoolsでビルドします。 setup.pyがある階層で以下のコマンドを叩くと完了です。

python setup.py sdist bdist_wheel
├── setup.py
├── MANIFEST.in
├── Makefile
├── QEPPI
│   ├── QEPPI.py
│   ├── __init__.py
│   ├── constant.py
│   ├── util.py
│   └── version.py
├── QEPPI.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   ├── requires.txt
│   └── top_level.txt
├── build
│   ├── bdist.macosx-10.12-x86_64
│   └── lib
│       └── QEPPI
│           ├── QEPPI.py
│           ├── __init__.py
│           ├── constant.py
│           ├── util.py
│           └── version.py
├── dist
│   ├── QEPPI-0.1.10-py3-none-any.whl
│   └── QEPPI-0.1.10.tar.gz
├── README.md
├── LICENSE

最初のディレクトリと比べると、.egg-infobuild/dist/ が作られます。最終的に登録するのはdistの中身になります。

PyPIへのupload

早速登録したいのですが、まずいわゆるユーザー登録の必要があります。そして、PyPIにはテスト用の環境と、本番用の環境があります。

test.pypi.org

pypi.org

また、setup.pyのコマンドでupしてもいいのですが、今回はtwineを使います。(最初にインストールした) github.com

また、README.mdをそのままlong descriptionに設定している場合は、本当に今のREADME.mdで良いかをしっかりと検討して、やりきってからupに進んだほうが良いです。というのもTest.PyPIPyPIもupのやり直しができません。versionを同じままで、descriptionだけ変えたいということができない(と思う)ので気をつけましょう。基本的に変更はversionを少しでもいいから上げる(1.0.0なら1.0.1とか) 削除しても同じ名前だと記録が残っているので、削除してもダメです。

Test.PyPI (練習用)へのupload

README.mdのチェックが終わったら、upします。 以下のコマンドでTest.PyPIにup出来ます

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

パスが求められるのでユーザー登録したときのusernameとpassを入れましょう。

upが終わったら、出力されるURLを見に行きましょう

test.pypi.org

こんな感じなので、

pip install -i https://test.pypi.org/simple/ QEPPI

のようにコマンドを叩くと、ローカル環境にインストールされます。 インストール後に、適宜問題が無いかチェックします。必要があれば、テストコードを走らせる等しましょう。

PyPI (本番)へのupload

ここまで来てしまえば、同じ様に本番にupします。

twine upload --repository-url https://pypi.org/legacy/ dist/*

こちらでも、パスが求められるのでユーザー登録したときのusernameとpassを入れましょう。

upが終わったら、出力されるURLを見に行きましょう。

pypi.org

こんな感じになって、PyPI登録出来ました!!!

あとは、適当な環境で

pip install QEPPI

のようにインストールをすると、依存関係もインストールされるのが確認できます。

f:id:black_tank_top:20211004193203p:plain
pip installしたときの様子

Makefileによるタスクフロー化

これからバージョンを上げていくときに便利なようにMakefileを使って、タスク化してしまいましょう。

その前に、毎回、パスを入れるのも面倒なのとセキュリティ的にもちょっと微妙なので、API tokenを使って登録出来るようにします。アカウント設定の下の方から取得出来るのでそれぞれ取得して下さい。

そうしたら、~/.pypircを作って下さい。中身は以下のようにしましょう。usernameをtokenとするとpassはAPI tokenと認識するようです。(ちなみにここに、自分のusernameとpassを書いてもよいがtokenのほうが良いですね)

[distutils]
index-servers =
  pypi
  testpypi

[pypi]
username = __token__
password = pypi-~~~tokenを入れる

[testpypi]
username = __token__
password = pypi-~~~tokenを入れる

これで設定はバッチリです。

では、話を戻して、Makefikeの例を見ていきましょう。

私はコマンドを手で叩くのが一周したら、必ずこの様なMakefileを書きます。Rakeでも良いですが環境を作る必要がないのでMakefileをタスク実行ツールととして使っています。

make clean : 一度、Buildするとegg.Infoとかdistの前のバージョンが残ったままになってしまいます。なので、まずcleanで過去のパッケージを消します。単純にrm -rfで消します。
make build : ビルドしてupするためのdistを作ります。
make test-deploy : Test.PyPIにupします。
make deploy : PyPIにupします。

この様にMakefileでタスク化しておくとしばらく経ってからのバージョン変更の際にも、記憶に優しく実行できますね。

あとはパッケージをUpdateしていきましょう!

ポイント

PyPIのdescriptionとGitHubのREADME.mdが一致しないとなんか気持ち悪いですが、PyPIは過去のバージョン、GitHubがdevelopバージョンと割り切って、GitHubで開発を進めて、ある程度機能が備わったらPyPIにバージョンを上げたものをuploadといった様にするのが良いかと思います。

今回の内容をまとめたスライド

研究概要 + PyPI登録に関連する資料を作成しました。 Speaker Deckにupしてありますので興味ある方はそちらも御覧ください。

speakerdeck.com


終わりに

今回は、自分が開発したパッケージをpip install QEPPIのようにインストール出来るようにするために、PyPIにuploadする手順をまとめました。初めて行った作業で、まだわかっていない部分もありますが、だいたいこの手順で行えばそこまで問題は起きないかなと思います。

今回改めて、普段何気なく使っているOSSツールがとても大変な労力をかけてやられているのだと実感しました。

また、質問を受けて思ったのは、 * Condaでの公開方法との違い * PyPIへuploadするときのテスト関係 * プラットフォーム別のバイナリーデータについて ここらへんは、今後、きちんと調べてきたいと思います。

資料作って、話し、質問を受けるということをするととても勉強になり、参加してよかったなと思いました。

参考にしたブログ等

公式以外で参考にしたものは以下です。ありがとうございました。

zenn.dev

www.m3tech.blog

qiita.com

qiita.com

qiita.com

参考文献

導入でPPIの説明に出てきた内容の文献はこちらです。

  1. Shin, W.-H.; Kumazawa, K.; Imai, K.; Hirokawa, T.; Kihara, D. Current challenges and opportunities in designing protein–protein interaction targeted drugs. Adv. Appl. Bioinform. Chem. 2020, 13, 11–25, doi:10.2147/AABC.S235542.

  2. Morelli, X.; Bourgeas, R.; Roche, P. Chemical and structural lessons from recent successes in protein-protein interaction inhibition (2P2I). Curr. Opin. Chem. Biol. 2011, 15, 475–481, doi:10.1016/j.cbpa.2011.05.024.

  3. Bickerton, G.R.; Paolini, G. V.; Besnard, J.; Muresan, S.; Hopkins, A.L. Quantifying the chemical beauty of drugs. Nat. Chem. 2012, 4, 90–98, doi:10.1038/nchem.1243.

  4. Jumper, J.; Evans, R.; Pritzel, A.; Green, T.; Figurnov, M.; Ronneberger, O.; Tunyasuvunakool, K.; Bates, R.; Žídek, A.; Potapenko, A.; et al. Highly accurate protein structure prediction with AlphaFold. Nature 2021, doi:10.1038/s41586-021-03819-2.

QEPPI論文がPublishされました。

はじめに

2021/10/10に自身がこれまで取り組んできた研究成果をまとめた論文がInternational Journal of Molecular Sciences誌に掲載されました。

Kosugi T, Ohue M. Quantitative Estimate Index for Early-Stage Screening of Compounds Targeting Protein-Protein Interactions. International Journal of Molecular Sciences. 2021; 22(20):10925. https://doi.org/10.3390/ijms222010925

論文概要

タンパク質間相互作用(PPI)は最近注目されている創薬の標的です。薬となる化合物を設計する際に、その化合物がPPIを標的にできそうかどうかの度合いを定量的にスコア化する手法はありませんでした。そこで、化合物がPPIを標的にできそうかどうかを定量的にスコア化する手法を開発したという内容になっています。

簡単に論文をまとめたスライド

@antiplasticsさんからBio"Pack"athon2021 #10へ参加しませんか?ということで誘っていただいたので研究概要 + PyPI登録に関連する資料を作成しました。Speaker Deckにupしてありますので興味ある方はそちらも御覧ください。

speakerdeck.com

QEPPIのコード

論文で用いられている、低分子化合物のPPIを標的にできそう度合いをスコア化した「QEPPI」はGitHubで公開しています。 https://github.com/ohuelab/QEPPI

github.com

QEPPIのロゴ

今回はQEPPIをイメージしやすいように、ロゴを作成しました。

f:id:black_tank_top:20211012061111p:plain
両サイドの2つがPPIをイメージしており、中央の紫がPPIを標的とするような化合物をイメージしたロゴになっています。

Graphvizを用いたニューラルネットのGraph構造の作図

ニューラルネットのGraphをサクッと作りたく、Graphvizで簡単にできたのでその紹介。

細かい設定を色々試したかったので、その結果をGistにupしてお来ました。

かなり細かい設定ができるので、コードからどこをいじると何が変化するかっていうのを理解しながら適宜調整すると良いかと思います。

ポイントは、 * バックグラウンドを透明にする bgcolor="transparent" * ノード群が四角で囲われるのでその線を透明にするsubgraph cluster内での、color="transparent"; この2つをやっておけばpngで背景透明でいい感じに出力できます。(逆にそれぞれ色を設定してやってみると、どういうことかわかります)

でこのコードをColabでも自身の環境でもいいので叩くと、

f:id:black_tank_top:20211012063755p:plain
Graphvizを利用したNNのGraphの作図例

こんな感じのものが出来上がります。(実際に出来上がるのはもっと高画質です。)

Weekly Life Science Informatics News 始めました。

機械学習界隈ではRevueを使って発信している人が幾人かいるのですが、生命情報科学界隈ではあまりいない(見たこと無い)し、Twitterの機能の一部にRevueを使ったニュースレター機能が出来たので少しやりやすくなったということもあって、最新の動向を追う目的で、ふと思い立って、Weekly Life Science Informatics Newsという名称でニュースレターを始めました。

バイオインフォマティクスとケモインフォマティクスをイメージして、こんなロゴまで作ってしまったので、ちゃんと続けないと。まぁとはいってもテンプレートで簡単に作れるもので作ったので大した手間ではなかったです。(むしろ外枠のWeekly Life Science Informatics News を円形に囲むほうが大変だった・・・)

f:id:black_tank_top:20210921131646p:plain
Weekly Life Science Informatics Newsのロゴ
ちなみにこのロゴは、DesignEvoで作成しました。

第1回はAMED-BINDS講習会が開催やAlphaFold2のまとめサイトについての紹介。その他いくつかの論文について書きました。無料で購読できますSubscribeするとメールでお知らせが来ます。「編集作業を応援したい!」と思って頂けたらぜひスポンサーをお願い致します。

手探りですが、今後しばらく続けて最近の動向をおさえる様にしようと思っています。