プロジェクト向けGPU · KYC不要の暗号資産決済 レンタル方法
日本語
コンソールを開く
実践ガイド / KERNODECK

ノートブックは動いています。セルなしで再実行できますか?

ノートブックからスクリプトへ移行するには、空のカーネルから始め、入力を特定し、計算を関数に抽出します。次に、プログラムに明示的な引数と、出力先の別ディレクトリを与えます。成功は新しいプロセスで期待される結果とともに確認できます。セルをPythonファイルにエクスポートするだけでは、体験を再現可能にするには不十分です。

2 分で読了 · 開発者向けガイド

1. カーネルがまだ保持しているものを突き止める

ノートブックのファイルとカーネルの状態は、必ずしも同じ状況を示すとは限りません。変数が削除されたセルに由来していたり、リストが何度も変更されていたり、最後のコード変更前に読み込まれたオブジェクトがメモリに残っていたりする可能性があります。したがって、表示された結果は、現在のセルが見えている順序でまだその結果を生み出していることを証明するものではありません。

作業用のコピーを保存し、カーネルを再起動してから、セルを最初から最後まで実行してください。失敗した、あるいは結果が変わった最初のセルに注目します。古いセッションから手動で変数を再注入するのではなく、不足している依存関係を探してください。Jupyter カーネルは独立したプロセスです。タブを閉じることは、まっさらな環境を再構築することと同じではありません。

外部への影響も洗い出してください。ダウンロード、パッケージのインストール、ディレクトリの変更、すでに生成済みのファイルの読み込み、環境変数の使用などです。結果が即座に得られたように見えるセルは、単に古いファイルを再利用しているだけかもしれません。将来のスクリプトは、意図的な入力と試行の名残を区別できなければなりません。

2. コードを移す前にコントラクトを書く

抽出するタスクを1つだけ選びます。例えば、スコアのファイルを読み込み、スコアがしきい値に達した識別子を保持し、結果を書き出す、といったものです。このガイドの例は教育目的であり、実行されるものではなく、GPU も使用しません。これは実行の依存関係を示すためのものであり、計測や Kernodeck に付属するツールを謳うものではありません。

変換を検証できるよう、入力、パラメータ、出力を十分な精度で定義します。ここではしきい値は境界を含み、スコアが 0.5 に等しいものも残されます。識別子はスコアと対応を保ち、入力の順序は維持されます。既存の出力が、新しい試行によって意図せず置き換えられてはなりません。

この手順は曖昧な移行を避けるためのものです。ノートブックがしきい値と等しいスコアを除外する一方でスクリプトがそれらを保持する場合、計算を変更したことになります。それが修正なのかリグレッションなのかを明示的に判断してください。境界にちょうど位置するケースを保持し、単に離れた2つの値だけで済ませないようにしてください。

表をスクロールしてすべての列を表示してください。
実行を謳わない、教育的な選択のコントラクト。
要素例の値基準
入力a:0.4、b:0.8、c:0.53つの異なる識別子、スコアはすでに 0〜1 の範囲で検証済み。
パラメータしきい値 0.5以上かどうかの比較。
期待される出力b、次に c2つの識別子、重複や並べ替えなし。

3. セルに依存しなくなった関数を抽出する

変換と、読み込み・書き出しの操作を分離します。計算関数はデータとしきい値を受け取り、選択された識別子を返します。seuil という名前のグローバル変数を参照したり、暗黙的にファイルを開いたり、入力リストを変更したりしません。これにより、ノートブックとスクリプトがまったく同じ計算を呼び出せます。

この抜粋では、データは前述のコントラクトに従ってすでに検証済みと想定しています。したがってこの関数は、完全なファイル検証機能ではありません。この制限は意図的なものです。フォーマットはプログラムの入口で確認し、変換は理解しやすいままに保ちます。パラメータを追加するのに、値を変更していたセルを探し直さなければならないようではいけません。

ノートブックは探索のためのツールとしてそのまま使えます。関数のコピーをもう一つ保守するのではなく、ノートブックにこの関数をインポートさせてください。モジュールを変更した後は、新しいカーネルから再開して両方の経路を比較してください。すでにインポート済みの古い関数が検証を狂わせてはいけません。

教育的な関数 — ご自身のモジュールに配置するもので、ここでは実行されません
def retenir_identifiants(records, seuil):
    return [
        record["id"]
        for record in records
        if record["score"] >= seuil
    ]


if __name__ == "__main__":
    records = [
        {"id": "a", "score": 0.4},
        {"id": "b", "score": 0.8},
        {"id": "c", "score": 0.5},
    ]
    attendu = ["b", "c"]
    obtenu = retenir_identifiants(records, 0.5)
    if obtenu != attendu:
        raise SystemExit("Sélection inattendue")

4. パラメータを見える入力にする

スクリプトのエントリポイントは引数を処理し、選択肢を検証し、関数を呼び出します。標準モジュールの argparse はオプションを記述し、ヘルプを生成しますが、ビジネスルールは把握しません。構文的に受け入れられる浮動小数点数でも、許容範囲外である可能性があります。この例のしきい値には、追加のチェックが必要です。

パスの解決方法を明確にしてください。コマンドを起動したディレクトリを基準にするのか、明示的に選択したプロジェクトフォルダを基準にするのかを決めます。計算の途中で隠れたディレクトリ変更を行わないでください。以下のブロックは引数の解析のみを示しています。データの読み取りと書き込みは、リーダープログラム側で接続する必要があります。

シークレットはこれらの引数から排除してください。共有可能なパラメータは実験内容を記述するものであり、リポジトリやストレージへのアクセスは別の経路で行います。同僚に渡すコマンドは、トークンも一緒にコピーしなくても使えるものでなければなりません。

学習用の引数解析 — 未実行の抜粋
import argparse
from pathlib import Path


def lire_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument("--input", required=True, type=Path)
    parser.add_argument("--output", required=True, type=Path)
    parser.add_argument("--seuil", required=True, type=float)
    args = parser.parse_args()
    if not 0 <= args.seuil <= 1:
        parser.error("Le seuil doit être compris entre 0 et 1.")
    return args

5. スクリプトに終わりと検証可能な出力を持たせる

オーケストレーションは main 関数に置き、if __name__ == "__main__" の条件で起動します。これにより、モジュールをノートブックからインポートしても、処理が即座に実行されることはありません。インポートはツールを定義し、メインエントリがいつ読み取り、計算し、書き込むかを決定します。

実行ごとに個別のフォルダを割り当ててください。実際に使用した非機密のパラメータと入力の識別情報を記録し、そのうえで結果を書き出します。私たちの選定では、識別子の個数、それらが入力に含まれること、しきい値のルールを確認します。正しく整形された JSON ファイルでも、誤った識別子を含むことがあります。ファイルが存在するだけでは十分ではありません。

入力ファイルが存在しない場合や、出力先が使用できない場合は、明示的に失敗するようにしてください。これらの問題を空のリストで置き換えないでください。空のリストは有効な選定結果と解釈される可能性があります。プログラムは、しきい値を満たす結果がなかった場合と、読み取りに失敗したために結果がなかった場合を区別しなければなりません。

6. 2つの新規実行で比較する

まず3つの教育用行を使用します。しきい値 0.5 では b と c、0.9 では空のリスト、0.4 では3つの識別子すべてが期待されます。これらの答えは契約から導き出されるものであり、ここで実行された結果として提示されるものではありません。これらにより、比較演算子の反転や順序の誤りを特定できます。

次に、再起動したノートブックとスクリプトを、同じ入力に対して新規プロセスで実行します。スクリーンショットやファイルに記載された時刻ではなく、有用な値を比較してください。代表的な2つ目のデータセットと、無効な入力も追加します。出力がより簡素に表示されるなど、想定される差異を文書化してください。

nbconvert による変換は、セルの初期移行を迅速化できますが、そのマジックコマンドは依然として Jupyter に依存している可能性があります。ノートブック固有の命令、不要な表示、その場しのぎのインストールを削除または置き換えてください。エクスポートは出発点にすぎません。新しい状態からの比較が、移行が完了したかどうかを決定します。

7. 隠れた状態を持ち込まずに GPU へ移行する

CPU での流れを理解したら、モデルの読み込みとバックエンドを同じ明示的な構造に接続します。バージョン、精度、入力、出力先を維持してください。GPU への移行は、一貫性のないセルの順序や、古い試行で生成されたファイルを修正するものではありません。PyTorch が選択したデバイス上で実際に計算できることを、別途確認してください。

2回の起動で異なる値が得られた場合は、忘れられた状態、乱数源、計算の数値的限界を区別してください。シードは、バージョンやハードウェア間で同一性を普遍的に保証するものではありません。中断された学習については、checkpoint 専用の手順を使用してください。本ガイドはエントリポイントを変換するものであり、オプティマイザやジェネレータの状態を復元するものではありません。

有用な成果物は、コマンド一つで説明できるプログラムです。前提条件と結果の確認方法も含みます。ノートブックは探索と可視化のために自由に使えますが、計算の起動方法に関する記憶をノートブックだけが担う必要はなくなります。

よくある質問

プロジェクトを再現可能にするためにノートブックを捨てるべきですか?

いいえ。ノートブックは探索と提示のために残しつつ、再利用する計算は関数やモジュールに切り出し、スクリプトからも呼び出せるようにしましょう。検証は新しいカーネルと明示的な入力からやり直す必要があります。

ノートブックを.pyにエクスポートするだけで十分ですか?

いいえ。エクスポートは可視化されたコードを移動するだけで、依存関係の順序や実行済みセルの影響を修正するものではありません。マジックコマンドは依然としてJupyterを必要とする場合があります。スクリプトは新しいプロセスで検証してください。

バイト単位で同一のファイルを取得する必要がありますか?

その基準が対象のフォーマットにとって意味を持つ場合のみです。まずは期待される識別子、値、ビジネスルールを比較してください。日付やメタデータは計算結果を変えずに異なることがあります。数値の許容誤差は明示的に定義する必要があります。