Skip to content

既知の制限 ​

Fione ができないこと、条件付きでできることを、話題別にまとめました。これからやろうとしていることに合う節を読んでください。ほかの人のために Fione を動かす場合は、最初の節とデプロイの節が全員に関係します。

セキュリティとアカウント ​

  • サーバー側でセッションを無効にできません。 セッションの Cookie は署名付きで、サーバー側に状態を持ちません。ログアウトで消えるのはそのブラウザーの Cookie だけで、コピーされた Cookie は有効期限(FIONE_SESSION_MAX_AGE_SECS、既定は 7 日)まで使えます。セッションはパスワードに結び付いているので、パスワードを変更すると、そのユーザーのすべてのセッションが終了します。
  • 管理者がパスワードを再設定しても、そのユーザーの API トークンは残ります。 アカウントが乗っ取られたおそれがあるときは、トークンも無効にしてください。ユーザーは「アカウント」のページから、管理者は API(DELETE /api/v1/tokens/{id})から無効にできます。管理者が他のユーザーのトークンを管理する画面はありません。ユーザーを削除するとそのトークンも削除されますが、プロジェクトまたはジョブを所有しているユーザーは削除できません。
  • 自分で作った API トークンに有効期限はなく、最後に使われた日時も記録しません。不要なトークンは「アカウント」のページで無効にしてください。
  • アップロードした Python モジュールはサンドボックスなしで動きます。 ジョブのワーカーの中で、サーバーと同じ権限で動き、秘密鍵や環境変数を読めます。アップロードできるのは管理者だけで、警告の確認が必要です。組み込みのモジュールには当てはまりません。
  • モジュールを置き換えると、待機中のジョブにも影響します。 待機中のジョブは、キューに入れた時点ではなく、ジョブが始まる時点のモジュールのソースで動きます。
  • 管理者以外に見せるエラーメッセージからファイルのパスは消えますが、URL やホスト名は残ります(たとえばストレージのエラーの seaweedfs:8333)。
  • CSV のダウンロードは、表計算ソフトの数式インジェクション対策をしていません。 = で始まるセルはそのまま書き出され、表計算ソフトが数式として評価することがあります。
  • 管理者ができるまで、最初の管理者のセットアップトークンがログに残ります(FIONE_SETUP_TOKEN を設定した場合を除く)。最初の起動のあと、早めに管理者を作成してください。
  • S3 の認証情報は、コンテナーの環境変数に見えています(docker inspect、docker exec)。ホストで Docker を使える人には見えます。

モデルとインポート ​

  • インポートしたモデルを信頼するのは、要求したときだけです。 この環境で署名していないモデルは、管理者がインポート時に信頼のオプションを選んだ場合だけ読み込まれ、モデルはインポート(未検証) と表示されます。モデルのファイルを読み込むとコードが実行されるので、出どころの分かるファイルだけを信頼してください。
  • 想定外の内容のインポートは断られます。 有限でない数や float の範囲を超える整数が(診断の中も含め)どこかにあるレコード、未知の項目を持つ診断や、学習が書き出すより深く入れ子になった診断が該当します。Fione が作るエクスポートには、そのような値は入りません。
  • モデルの診断には学習データの値が含まれます。 クラスのラベルと、回帰では学習行から抜き出した最大 2,000 件の実際の目的変数の値とその予測値です。プロジェクトを読めるすべての人に見え(指標タブと GET /api/v1/models/{id}/diagnostics)、モデルのエクスポートにも入り、学習データのデータセットを削除しても残ります。保存した説明も、カテゴリやクラスのラベルをデータセット削除後も保持します(エクスポートはされません)。モデルファイルとサービング用ファイルには診断は入りません。
  • モデルはイメージのタグに結び付いています。 Fione Serving は同じタグのイメージで学習したモデルだけを読み込みます。古い版で学習したモデルが新しい版で読み込める保証はありません。アップグレードのあとは、使っているモデルを学習し直し、それまでは残しておいたイメージでサービング用ファイルを動かしてください(運用を参照)。
  • 全モデルのエクスポートは、プロジェクトごとに最新の 1 つだけ残ります。 新しいエクスポートが置き換えます。プロジェクトを読める人なら誰でもエクスポートを始められます。

ジョブとデータ ​

  • 実行中のジョブのキャンセルには最大 10 秒かかります。 ワーカーは止まるまでにその時間を与えられ、そのあとで強制終了され、キャンセルの要求はそれを待ちます。
  • プロジェクトに属さないジョブは GET /api/v1/jobs に出ません。 管理者は ID を指定すれば読めます。
  • 説明のジョブはほかのジョブと並んで一覧に出ますが、プロジェクトの概要ページの最近のジョブには出ません。
  • プロジェクトやデータセットの削除は、先に記録を、あとからファイルを消します。 その間にストレージが失敗すると、バケットにファイルが残ることがあります。
  • データセットは学習・バッチ予測・Python モジュールのために丸ごとメモリに読み込みます(ストレージを使った分割処理はありません)。16 コアの Mac で測ると、学習ジョブのメモリは、150 MB の CSV(20 万行 × 42 列)で最大約 1.9 GB、750 MB の CSV(100 万行 × 42 列)で約 2.5 GB でした。そのうち約 1.5〜1.7 GB はデータの大きさによらない分(ライブラリ)です。メモリは 4 GB 以上を目安にし、列の多いデータや大きなファイルではもっと用意してください。
  • 列の多いデータでは、one-hot の展開のためにモデル種類が外れます。 Linear、TextLinear、DeepLearning は、データを one-hot エンコードしたコピーを使います(カテゴリの列ごとに最大 15 水準、1 セル 8 バイトで、分割ごとにさらにコピーします)。そのコピーが 1 億セルを超えるときは、お知らせを出して、この種類を実行から外します。
  • 学習やエンジンのメッセージは、日本語の画面でも英語です。

学習とスコア ​

  • 交差検証のスコアはやや楽観的です。 ブースティングのモデルは検証の分割で早期に終了し、アンサンブルの重みは、採点するのと同じ out-of-fold の予測で決めるためです。リーダーボードの Ensemble の行、指標タブ、星の評価もその影響を受けます。正直な数値は、学習に使わないテストデータで確かめてください。
  • エンジンは実際には、最大実行時間の約 3 分の 2 を使います。 探索と最終のリフィットで、時間が使い残されるためです。
  • 後発の TextLinear の候補には時間が必要です。 文章の列があるデータでは、TextLinearWide、TextLinearChar、TextLinearPlain を、ほかのモデル種類のあとで、そのために確保した探索時間の 15%(TextLinear 以外の種類から取り分けます)と、ほかの種類が使い残した分で実行します。とても短い実行では、試されないことがあります。最終のリフィット用の時間には入り込みませんが、探索時間の終わりに実行中の分割の学習は(ほかのモデル種類と同じく)中断されません。TextLinearChar は、文章が約 500 万文字を超えるときと、空白のない文章の列があるときは試さず、TextLinearPlain は派生特徴量が採用されなかったときは試さず、モデルがサイズ上限を超える後発候補も試しません。
  • 負荷の高いマシンでは、同じ時間予算で学習できるブースティングの回数が減ります。 いちばん影響を受けるのは CatBoost です。
  • 派生特徴量を採用するかの判定は、交差検証と同じ行を使います(別の分割と厳しい基準で)。そのため、学習のスコアはやや楽観的です。小さいデータでは、損失の 1% 程度の本物の改善でも基準を満たさず、採用されないことがあります。判定の時間が足りなくなると、基準を通っても最後の確認が済んでいないグループは、損失を 5% 以上減らしたものを除いて捨てるので、短い実行では 1 つも採用されないことがあります。判定は最大 2 万行のサンプルと小さな LightGBM で行うため、ニューラルネットワークや線形モデルだけが使う特徴量は見つかりません。ターゲットエンコーディングと、カテゴリとしての組み合わせは作りません。派生特徴量を参照してください。
  • 識別子のグループの大きさは学習行だけで数えます。 学習グループの行は自分自身を数え、新しい行は数えません。あとから届く行も数えません。
  • 値が 200 種類を超える文字列の列は、モデルには各値の出現頻度(学習行に占める割合)として読まれます。 そのため、名前、コード、ほぼ一意の ID は、それだけではほとんど手がかりになりません。その部分や文章は、派生特徴量が採用されたときの派生特徴量(と、文章の列では TextLinear)を通してだけ読まれます。学習で見なかった値には、学習で最も少ない値の割合を与えるので、新しい行もモデルが学習した範囲に収まります。
  • 追加のシードで、モデルは大きくなり、予測は遅くなります。 最終のリフィットのあとに時間が余ると、ブースティングとフォレストの各メンバーを最大 4 回まで別のシードで学習し直します。予測、重要度、寄与は平均するので、その回数だけコストが増えます(サイズの上限は守られます)。Linear と TextLinear は決定的なので、繰り返しません。

説明とリークの警告 ​

説明の読み方はモデルの説明を参照してください。

寄与 ​

  • 寄与は近似です。 各行の寄与(結果の画面、API、バッチ予測、Fione Serving)は、丸め誤差の範囲で予測値に一致します。単位は、分類では確率、回帰では目的変数の単位で、log-odds ではありません。各ライブラリの TreeSHAP(LightGBM、XGBoost、CatBoost)、RandomForest と ExtraTrees は Saabas の経路ごとの寄与、Linear と TextLinear は係数と学習データの平均からの差の積(文章の列の単語は 1 行 1 値にまとめます)、DeepLearning は学習データの平均からの経路に沿った積分勾配を出発点とし、それを確率に変換して、アンサンブルで合成します。厳密な Shapley 値になるのは、変換の前のブースター単体だけです。3 クラス以上では、変換は数値的な経路積分で、その小さな残りは、合計が一致するように配分します。
  • 派生特徴量は、読んでいる列の分として数えます。 複数の列から作る特徴量(和、欠損値の数など)は、寄与と重要度をそれらの列に等分します。部分依存は、入力する列を動かして特徴量をすべて計算し直すので、影響を受けません。
  • 説明するのは 1 行につき 1 つの出力です。 2 クラスでは 2 番目のクラス(最後の p_ 列)、それ以上では予測したクラス(API では class_index で別のクラスを指定できます)、回帰では値です。バッチ予測と Fione Serving には、全クラスを求めるオプションがありません。
  • バッチ予測の寄与の列(各予測の内訳を含める、API では include_contributions)は、モデルの入力ごとの contrib_<列> と contrib_bias です(入力に bias という列があると contrib_bias_2)。名前がぶつかる入力列は input_<名前> になります。1 行あたり入力の列数 + 1 個の float64 の列が増え、2,000 列のモデルで 10 万行なら約 1.6 GB の出力になります。説明するのは最大 10 万行で、4 スレッドまで(Linear、TextLinear、DeepLearning は数値ライブラリ任せ)、最大 5,000 行ずつ計算するので、通常の予測よりかなり遅くなります。

保存された説明 ​

  • 説明にはデータセットが必要です。 説明のジョブ(FIONE_EXPLAIN_AFTER_TRAINING が false でなければ学習のたびに待機に入ります)と、その場で計算する曲線は、モデルの学習データを使います。インポートしたモデルや学習データを削除したモデルにはそれがないので、説明タブの説明を計算で、モデルの列がそろったデータセットを選んでください。それまでは、Web の画面には保存済みの曲線だけが表示されます。
  • 説明のジョブが保存するもの: 最大 1,000 行(クラス数 × 列数の多いモデルではもっと少なく)の寄与による重要度(クラス別に抽出)と、重要度の高い 10 列の部分依存です。曲線のグリッドは 1 万行のサンプルから作り、そのうち 300 行(列の多いモデルではもっと少なく)で平均します。1 MiB を超える結果(非常に列の多いモデルや非常に長い名前のときだけ)は、削られます。重要度の低い列(1,000 列を超える分)、次に 1 行ごとの線(ICE)、最後に曲線ごと、の順です。削られたことを示す目印はありません。
  • 部分依存のグリッドは 2〜98 パーセンタイルまでなので、長い裾は表示されません。数値のグリッドには欠損値の点がありませんが、カテゴリのグリッドにはあります。タイムゾーン付きの時刻は UTC で表示します。学習で見なかったカテゴリの水準がグリッドに入ることがあり、そこでは未知として扱います。その場で計算する曲線(保存した曲線がない列、または API)は、グリッドも平均も最大 300 行(列の多いモデルではもっと少なく)から作るので、保存した曲線と点が違うことがあります。
  • 診断(指標タブ)は、アンサンブルの out-of-fold の予測から作るため、交差検証のスコアと同じく、やや楽観的です。20 万行を超えるときはランダムサンプルから作ります。診断なしでインポートしたモデルや、計算できなかった、または 256 KiB を超えたモデルには、診断がありません。

その場で求める説明 ​

  • Web のプロセスは、信頼できるモデルを、求められたときに読み込んで説明します。 閲覧者も、予測の結果のページを開いたときの先頭 5 行の理由、最大 100 行の寄与、1 列の部分依存を求められます。読み込んだままにするのは、2 モデル・512 MiB までです。
  • その場で求める説明は、サーバー全体で 1 件ずつ計算します。 計算中は、あと 4 件まで最大 15 秒待てます。それ以外はすぐに「混雑」(HTTP 503)になるので、混んだ 1 人の読者が全員を遅らせることがあります。ファイルが 512 MiB を超えるモデル(409)、信頼を確認していないインポート(409)、行 × クラス × 列がリクエストに対して多すぎるモデル(422)はここでは断り、書き込み権限が必要な説明のジョブでだけ説明します。部分依存 1 本分の行は、データセットのファイルの最大 8 か所の先頭から読みます。列が数千あるデータセットでは、その読み込みだけで数百 MiB 使うことがあります。

リークの警告 ​

  • チェックを外すのは完全なリークだけです。 予測する列と同じ列や、値で答えが決まる列は、EasyML の既定から外れます(行の ID の列は ID としてチェックを外します)。スコアだけが高い列は、警告付きでチェックされたままです。その列だけで答えを当てる列、並び順や欠損が答えに沿う列、ほぼ完全に相関する列(相関の絶対値が 0.99 以上)です。
  • リークのスコアは警告であり、どちらの向きにも間違えます。 強い正当な列が疑われることも、リークを見逃すこともあり、警告がないことはリークがないことを意味しません。単独の AUC が 0.95(回帰では R² が 0.90)以上で、その線未満で最も高い列より 0.10 以上高い列、またはどの場合でも 0.99 以上の列が警告されます。すでに 0.89〜0.95 の列がある場合は 0.99 以上だけが警告になり、値の 1% が違う答えのコピー(0.987。乳がんデータセットの列と並べて測定)は報告されません。一方のクラスで常に 0 の列(もう一方の 80% だけ値がある金額など)は最大 0.90 で、警告されません。回帰のリークは約 5,000 行未満ではほとんど見逃します。
  • 確認には限りがあります。 101 クラス以上の目的変数にはスコアがなく、画面にもそう表示されません。完全な一致の確認だけが動きます。採点には最大 10,000 行を使い、200 行未満のデータセットは採点せず、3 秒で打ち切ると、採点しなかった列があることを表示します。

デプロイと Fione Serving ​

  • 1 プロセスだけで動かしてください。 fione サービスは 1 ワーカーで動かし、スケールさせないでください(設定を参照)。
  • Fione Serving には認証がなく、予測のリクエスト数・同時実行数の制限もありません(あるのはリクエストサイズの上限だけです)。寄与を求めるリクエストは同時に 2 件まで(既定。それ以上は 503)ですが、計算中はモデルを占有するので通常の予測はその間待たされ、最大のリクエストでは約 100 MiB のメモリを使います。画面に出る docker run --rm -p 8081:8080 … はすべてのネットワークインターフェースで公開するので、このマシンだけで使うなら -p 127.0.0.1:8081:8080 にし、ほかの人に使わせるなら認証付きのリバースプロキシを置いてください。Fione Serving を参照してください。
  • イメージは大きく、fione が約 1.65 GB、fione-serving が約 1.7 GB です。ほとんどは機械学習のライブラリです。
  • イメージはまだ公開していません。 リポジトリからビルドしてください。バージョンのタグを付けると、リリースのワークフローが fione と fione-serving のイメージを(amd64 のみ)公開しますが、タグを付けたコミットのテストの完了は待ちません。CI が通ったコミットにだけタグを付けてください。
  • Linux では XGBoost が NVIDIA の NCCL ライブラリを取り込みます(nvidia-nccl-cu13。fione と fione-serving のイメージ内で約 350 MB)。Fione は CPU だけで学習するのですが、取り込まれます。パッケージのメタデータはライセンスを LicenseRef-NVIDIA-Proprietary としており、ホイール内のライセンス文は BSD-3-Clause 型です。ライセンスの確認では、許可ではなく要確認として報告されます。イメージを再配布する前に確認してください。CPU 専用の xgboost-cpu(Apache-2.0、NCCL なし)は macOS 用のホイールがないため使っていません。
  • ベースイメージはタグで固定しており、ダイジェストでは固定していません。 再ビルドすると、修正されたベースイメージを取り込むことがあります。

アシスタントと MCP ​

仕組みはアシスタントの設定と MCPを参照してください。

  • 答えは間違うことがあります。 既定のモデルは小さいものです。頼りにする結果は確認してください。提案された学習は、人が確認して初めて動きます。
  • 名前、統計、セルの値が言語モデルのサーバーに届きます。 データセットと列の名前、統計、値の例(列の最頻値、クラスのラベル、ジョブのメッセージ)は、質問のたびに設定した言語モデルへ送られます。MCP のクライアントには値の例を渡しません。このマシンの外のサーバーには管理者の一度だけの許可が必要で、チャットを使うすべての人に警告が出ます。
  • データ内の文章は、アシスタントの発言を左右できても、動作は左右できません。 アシスタントは読むことと提案することしかできず、提案は人が確認するまで何も始めません。
  • 実際のモデルのツール呼び出しは、opt-in のテストでしか確かめていません。 既定のテストは偽のサーバーを使い、実際のサーバーを使うテストは手動で実行します。
  • MCP は API トークンを使い(REST API と同じ権限)、同時 2 呼び出しまでで、ほかのレート制限はありません。既定はオフです。
  • 長い会話は黙って短くされます。 モデルのコンテキストに入るのは新しい部分だけなので、アシスタントは前に話したことを覚えていないことがあります。新しい話題は新しい会話にしてください。実際のコンテキストが FIONE_LLM_CONTEXT_TOKENS より小さいサーバーは、プロンプトを自分で切り詰めますが、Fione からは見えません。
  • 回答中に Fione を再起動すると、その回答は失われます(中断として終わります)。
  • 会話は暗号化せずにデータベースに保存され、管理者であっても Fione の画面では見えません。
  • macOS の Docker では Ollama は CPU だけで動きます。 そのため、既定はホストの Ollama アプリで、Compose からは host.docker.internal で届きます。
  • Ollama のイメージは約 3.8 GB、既定のモデルは約 8 GB です。
  • 異常なモデルサーバーへの放棄された要求は、サーバー側のタイムアウトまで、共有の接続プール(約 100)を占めることがあります。 設定を参照してください。
  • ドットのないサーバー名は「ローカル」とみなされますが、リゾルバーの検索ドメインでリモートのホストに届くことがあります。設定の FIONE_LLM_BASE_URL を参照してください。
  • システムページのコンテキスト警告は、モデルがロードされている間だけ出ます。 Ollama がコンテキストの長さを報告するのは、ロードされたモデルだけだからです。

ブラウザー ​

  • ダークモードは Chrome / Edge 123 以降、Firefox 120 以降、Safari 17.5 以降が必要です(CSS の light-dark())。古いブラウザーではライトテーマだけです。テーマを手で切り替えたあとは「システムに合わせる」設定がありません(戻すにはサイトのデータを消去してください)。
  • フレーズ単位の日本語の改行(word-break: auto-phrase)は Chrome / Edge 119 以降が必要です。ほかのブラウザーは通常どおり折り返します。
  • ログインには JavaScript が必要です。
  • シンプル / 詳細の表示はブラウザーごとに記憶します(Cookie)。ユーザーごとではありません。