Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitHubでの実験・分析コード公開 AI Lab スキルアップ研修 研究コードの公開 [基礎編]

GitHubでの実験・分析コード公開 AI Lab スキルアップ研修 研究コードの公開 [基礎編]

CyberAgent AI Labのスキルアップ研修にて発表した研究コード公開の作法についての基礎編です。

Avatar for Kazuhiro Ota

Kazuhiro Ota

March 11, 2025
Tweet

More Decks by Kazuhiro Ota

Other Decks in Research

Transcript

  1. とはいえ、ただ単にコードを公開するだけではダメ… GitHubにあがっている研究コード使ってみようとして困ったことないですか? • 論文タイトルとアブストラクトだけ書かれたREADMEでどう使えば? • requirements.txtの依存ライブラリなんか不足してない? • データセットはどこからダウンロードすれば? • 学習済みモデルはどこから(略)

    • ハードコードされた個人マシンのホームディレクトリパス • READMEに従ってもエラー出るんですが… • Python 3.5までバージョンダウンしたらやっとエラー消えた • CIUのML Platformでしか動かないの? • 推論コードだけ?学習コードはないの? コード公開にもやはりある程度のお作法があります… 4
  2. 前提知識 • Python ◦ 今回の資料で対象とする言語ですが、概念自体は他の言語にも応用可能です ◦ 何でも良いのでデータに対する処理を書いた経験があれば問題ないと思います • Git /

    GitHub ◦ 入門資料がネット上にたくさんありますので、まったく触れたことがなければ一度それらの チュートリアルをこなしてみてください ◦ ソースコードのバージョン管理についての概念と、コミット、リポジトリ、ブランチ、プル リクエスト&マージなどの用語についてなんとなく想像がつく状態であればOKです 7
  3. GitHub (CyberAgentAILab org.) でコードを公開するとは リポジトリの可視状態を Public に変更すること これでAI Labメンバーのみ閲覧・利用可能だったリポジトリが外部にも公開されます Internal

    or Private (非公開状態) Public (公開状態) 意図しない情報漏洩防止の為、会社のポリシーでリポジトリの初期可視状態はInternalもしくはPrivateとなります AI Labでは公開対象のリポジトリについて最終的にリサーチエンジニアでチェックし、セキュリティ・コンプライア ンスの面で問題なく公開可能なことを確認してからPublicに変更する運用としています 13
  4. 一般的なREADMEの内容 特にフォーマットはありませんが、ライブラリ・フレームワークを提供するソフトウェア開発 上では可能な限り下記のような情報を含めることが一般的 • リポジトリ名と一行説明 ◦ コード公開を行うGitリポジトリの名前と、何のコードであるかを短く説明します • 詳細な説明 ◦

    目的、主な機能、使用する技術など、より詳細な情報を図なども用いながら記します • インストール手順 ◦ ユーザーがコードを自分のシステムにインストールするための手順 ◦ 対象OS、依存関係や必要なツール、インストールコマンドなど • 使用方法 ◦ コードの基本的な使用方法 ◦ 可能なら、具体的なコード例やスクリーンショットも • 貢献方法 ◦ 他の開発者がプロジェクトに貢献するためのガイドライン ◦ バグレポートや機能リクエストの送り方、プルリクエストの作成方法など • ライセンス ◦ 他の人がリポジトリをどのように使用して良いかを明記します ◦ 主要なOSSライセンスについて調べておきましょう 17
  5. 研究コードの場合 研究で書いた実験・分析コードの場合、前述した一般的な項目に加えて下記につ いても言及することが望ましいです • 論文タイトル・著者名 • アブストラクト • アーキテクチャ図・実験結果図 •

    Bibtex • コードの意図と内容 • 入出力データの概要 • 実験環境と再現性 • データセット・事前学習済みモデルの設置とダウンロード方法 ココらへんは論文情報をほぼその まま掲載すればいいだけですが… 19
  6. 研究コードの場合 研究で書いた実験・分析コードの場合、前述した一般的な項目に加えて下記につ いても言及することが望ましいです • 論文タイトル・著者名 • アブストラクト • アーキテクチャ図・実験結果図 •

    Bibtex • コードの意図と内容 • 入出力データの概要 • 実験環境と再現性 • データセット・事前学習済みモデルの設置とダウンロード方法 ココらへんに触れられていないリ ポジトリを時々目にします… 公開コードという観点では大事な ことだらけ 20
  7. データセット・事前学習済みモデルの設置とDL方法 コードの実行に必要な研究用データセットや事前学習済みモデルなど、関連ファ イルを事前に取得してもらう必要がある場合は、その方法についても記載しま しょう • ファイルを配置するオンラインストレージを決めて事前に公開しておく ◦ ファイルの規模・種類によって適切なアップロード先を検討・選定する ◦ GitHubの場合、ファイルにつき100MBまであればリポジトリに直接含められます

    ◦ 100MB以上の場合はGit LFSやGitHub Releaseの利用を検討しましょう、数GBまでいけます ◦ ストレージの種類については発展編で詳しく触れたいと思います • 独自データセットの場合は中身についても記載する ◦ どんなデータなのかをファイル形式とともに具体的に ◦ テーブルデータのCSVファイルなのか、画像・テキストなどのメディアデータセットなのか ◦ データセットの場合サンプルが提示できるなら数サンプル程度掲載しておくと良いでしょう 25
  8. よく見る光景 読んだけど「さて何をどうすれば…?」となりがち • コードレビューなどで実際に他者とやりとりしないと実感がわきづらい • 実験・分析コードにはtoo muchな内容も • 書いたのJupyter Notebookだけなんだけどどうすれば?

    • もちろん研究内容をソフトウェア化したり、共著者間でチーム開発する となった場合には重要な内容ばかりです • コードを公開する段階ではなく書いているときに読むもの 実験・分析コードの公開であれば、コード体裁 を整えるための最低限を抑えておきましょう 30
  9. 最低限のコード体裁とは 下記を行いましょう どれもコードをツールにかけたり、事務的な変更削除対応を施すだけで完結するた め、ある程度コスパよくリファクタリングできます • コードフォーマット • 静的解析(Linter)対応 • 不要なコメントアウトの除去

    • コードカバレッジ率の向上 それぞれで紹介するツールに関する詳細は省きますが、 これもネット上に情報はたくさんありますので 少し調べると使い方がすぐわかると思います 31
  10. コードフォーマット ソースコードの書き方についてのスタイルや規約の話 • インデントの空白数、種類(スペース or タブ) • クラス・関数間の改行数 • 最大行長

    • 行の改行タイミング • 文字列のデフォルトクォーテーション 既に独自のフォーマットで実験・分析コードを書いていた、というのであれば飛 ばしてもらって構いませんが、そうでない方が多いと思われます 32
  11. 不要ファイルのコミット対象からの除外 公開する上でGitバージョン管理から除外すべきファイル・ディレクトリはまだ あります • OSシステムファイル • Pythonコンパイル結果(__pycache__ ディレクトリ) • 中規模(100MB)以上のデータセット

    • コードによる中間出力 • バージョン管理が不要な実験結果ファイル • 仮想環境(venvなど)ディレクトリ これらは .gitignore というファイルにファイルパスパターンを指定することでコ ミット対象から除外することが可能です 41
  12. 最後に共著者にレビューしてもらおう 共著者・チームメンバーにリポジトリを全体的にチェックしてもらいましょう • 明確さ ◦ 研究コードの目的、機能、使用方法などが明確かどうか • 完全性 ◦ READMEが必要な情報を過不足無く含んでいるかどうか

    ◦ インストール手順、使用方法、依存ライブラリ • 理解しやすさ ◦ 分野外の研究者やエンジニアも対象としている場合、専門用語やジャーゴンを避け、で きるだけ一般的な言葉で説明することが理想的です • フォーマットとスタイル ◦ 必要に応じて図、見出し、リスト、ボールド、イタリックなどのMarkdown機能を使用 して情報が整理・強調されているか • 動作可能性 ◦ 共著者に実際にインストール手順を試してもらい、実行に問題がないか確認してもらい ましょう 48
  13. 参考 • 研究者流コーディングの極意 • 研究で開発したコードの公開 • 研究のプログラミングにおける悲劇を無くすためのGitとテスト - Kesinの知 見置き場

    • 【GitHub】シンプルなREADME.mdの書き方 -コピペで使えるテンプレート 付き-|はやぶさの技術ノート • Pythonのリンター・フォーマッターをしっかりと理解する(Flake8, Black, isort, mypy) • Bandit を使って Python コードのセキュリティをチェックしよう! - サー バーワークスエンジニアブログ • 【Coverage.py】Pythonでカバレッジを取得する • Removing sensitive data from a repository - GitHub Docs 51