きちんずした機械孊習パむプラむンを曞く方法

こんにちは、Habr。



機械孊習のパむプラむン化ず䞊列化のトピックは、長い間私たちの仕事にありたした。特に、Pythonに重点を眮いた専門の本で十分なのか、それずももっず抂芁があり、おそらく耇雑な文献が必芁なのだろうか。機械孊習パむプラむンに関する玹介蚘事を翻蚳するこずにしたした。これは、アヌキテクチャ䞊の考慮事項ず、より適甚される考慮事項の䞡方をカバヌしおいたす。この方向の怜玢が適切かどうかに぀いお説明したしょう。





実行に時間がかかる機械孊習パむプラむンを䜜成したこずがありたすかさらに悪いこずに、チェックポむントに䟝存しおパむプラむンのステヌゞを1぀ず぀調査できるように、パむプラむンの䞭間郚分をディスクに保存する必芁がある段階に達したしたかさらに悪いこずに、そのような嫌な機械孊習コヌドを本番環境に移行する前にリファクタリングしようずしたこずがありたすかはい、機械孊習パむプラむンに長い間取り組んできた人は誰でもこれに察凊しなければなりたせんでした。では、十分な柔軟性ず、埌で本番環境に出荷するためにコヌドを簡単にリファクタリングする機胜を提䟛する優れたパむプラむンを構築しおみたせんか



たず、機械孊習パむプラむンを定矩し、パむプラむンステヌゞ間でブレヌクポむントを䜿甚するアむデアに぀いお説明したしょう。次に、パむプラむンを本番環境に移行するずきに足を螏み入れないように、このようなブレヌクポむントを実装する方法を芋おみたしょう。たた、ハむパヌパラメヌタを指定するずきにパむプラむンで実行する必芁があるオブゞェクト指向プログラミングOOPカプセル化に関連するデヌタストリヌミングずトレヌドオフに぀いおも説明したす。



コンベダヌずは䜕ですか



コンベダヌデヌタ倉換の䞀連のステップです。これは、叀いパむプずフィルタヌの蚭蚈パタヌンに埓っお䜜成されたすたずえば、「|」パむプたたは「>」リダむレクト挔算子を䜿甚したunix bashコマンドを思い出しおください。ただし、パむプラむンはコヌド内のオブゞェクトです。したがっお、各フィルタヌ぀たり、パむプラむンの各ステヌゞのクラスず、これらすべおのステヌゞを組み合わせお完成したパむプラむンにするための別のクラスを䜜成できたす。䞀郚のパむプラむンは、他のパむプラむンを盎列たたは䞊列に組み合わせるこずができ、倚くの入力たたは出力を持぀こずができたす。機械孊習パむプラむンを次のように考えるず䟿利です。



  • チャネルずフィルタヌ。パむプラむンのステヌゞはデヌタを凊理し、ステヌゞはデヌタから孊習できる内郚状態を管理したす。
  • . ; , . , – .
  • (DAG). , . : , , , , (, fit_transform ), , ( RNN). , , .








コンベダヌメ゜ッドコンベダヌたたはパむプラむンステヌゞには、次の2぀のメ゜ッドが必芁です。



  • デヌタのトレヌニングず状態の取埗に「適合」したすたずえば、そのような状態はニュヌラルネットワヌクの重みです
  • 実際にデヌタを凊理しお予枬を生成するための「倉換」たたは「予枬」。
  • 泚パむプラむンステヌゞがこれらのメ゜ッドのいずれかを必芁ずしない堎合、ステヌゞはNonFittableMixinたたはNonTransformableMixinから継承できたす。これらは、デフォルトでこれらのメ゜ッドの1぀の実装を提䟛するため、䜕も実行されたせん。




次のメ゜ッド は、オプションでパむプラむンステヌゞで定矩するこずもできたす。



  • “fit_transform” , , , .
  • 「セットアップパむプラむンのこれらの各段階で、「蚭定」メ゜ッドを呌び出したす」。たずえば、パむプラむンステヌゞにTensorFlow、PyTorch、たたはKerasニュヌラルネットワヌクが含たれおいる堎合、これらのステヌゞは独自のニュヌラルグラフを䜜成し、フィッティング前に「セットアップ」メ゜ッドでGPUず連携するように登録できたす。フィッティングする前に、ステヌゞコンストラクタヌで盎接グラフを䜜成するこずはお勧めしたせん。これにはいく぀かの理由がありたす。たずえば、開始する前に、自動機械孊習アルゎリズムの䞀郚ずしお、さたざたなハむパヌパラメヌタを䜿甚しおステップを䜕床もコピヌできたす。自動マシン孊習アルゎリズムは、最適なハむパヌパラメヌタを怜玢したす。
  • 「ティアダりン」、この方法は機胜的に「セットアップ」の反察であり、リ゜ヌスを砎棄したす。




次のメ゜ッドがデフォルトで提䟛され、ハむパヌパラメヌタ制埡を提䟛したす。







パむプラむンの再フィッティング、ミニバッチ凊理、およびオンラむン孊習



ディヌプニュヌラルネットワヌクDNNの孊習などのミニバッチ凊理を䜿甚するアルゎリズム、たたはパむプラむンたたはそのステヌゞに最適な匷化孊習RLなどのオンラむン孊習のアルゎリズム耇数の呌び出しを連鎖させお、次々に正確に远跡し、その堎でミニバッチのサむズに調敎するのが適しおいたす。この機胜は、䞀郚のパむプラむンおよびパむプラむンの䞀郚の段階でサポヌトされおいたすが、「fit」メ゜ッドが再床呌び出されるため、ある段階で達成された適合がリセットされる堎合がありたす。それはすべお、パむプラむンステヌゞをどのようにプログラムしたかによっお異なりたす。理想的には、パむプラむンステヌゞは、「ティアダりン」メ゜ッドを呌び出しおから「ティアダりン」メ゜ッドを呌び出した埌にのみフラッシュする必芁がありたす。setup」次のフィッティングたで、デヌタはフィッティング間たたは倉換䞭にフラッシュされたせんでした。



コンベダヌでのチェック



ポむントの䜿甚このコヌドを他の目的で䜿甚しおデヌタを倉曎する必芁があるたで、パむプラむンでブレヌクポむントを䜿甚するこずをお勧めしたす。コヌドで正しい抜象化を䜿甚しおいない堎合は、足を螏み入れおいる可胜性がありたす。



パむプラむンでチェックポむントを䜿甚するこずの長所ず短所



  • プログラミングずデバッグのステップがパむプラむンの途䞭たたは最埌にある堎合、ブレヌクポむントによっおワヌクフロヌを高速化できたす。これにより、パむプラむンの最初のステヌゞを毎回再蚈算する必芁がなくなりたす。
  • ( , ), , . , , – . , , , , , .
  • おそらく、蚈算リ゜ヌスが限られおおり、実行可胜な唯䞀のオプションは、䜿甚可胜なハヌドりェアで䞀床に1぀のステップを実行するこずです。ブレヌクポむントを䜿甚し、その埌にさらにいく぀かのステップを远加するず、構造党䜓を再実行する堎合に、䞭断したずころからデヌタが䜿甚されたす。




パむプラむンでブレヌクポむントを䜿甚するこずのデメリット



  • ディスクを䜿甚するため、間違っお実行するず、コヌドの速床が䜎䞋する可胜性がありたす。凊理を高速化するには、少なくずもRAMディスクを䜿甚するか、キャッシュフォルダヌをRAMにマりントしたす。
  • これは倚くのディスクスペヌスを必芁ずする可胜性がありたす。たたは、RAMにマりントされたディレクトリを䜿甚する堎合は倧量のRAMスペヌス。
  • ディスクに保存されおいる状態は管理が難しくなりたす。プログラムには、コヌドの実行速床を䞊げるために必芁な远加の耇雑さがありたす。機胜的なプログラミングの芳点からは、ディスクの䜿甚に関連する副䜜甚を管理する必芁があるため、機胜ずコヌドはクリヌンではなくなるこずに泚意しおください。ディスクキャッシュの状態の管理に関連する副䜜甚は、あらゆる皮類の奇劙なバグの枩床になる可胜性がありたす
..。



プログラミングで最も難しいバグのいく぀かは、キャッシュ無効化の問題から発生するこずが知られおいたす。



Computer Scienceでは、キャッシュの無効化ず゚ンティティの呜名ずいう2぀の非垞に泚意が必芁なこずがありたす。-フィル・カヌルトン




パむプラむンの状態ずキャッシュを適切に管理する方法に関するアドバむス。



プログラミングフレヌムワヌクずデザむンパタヌンは、特定のルヌルを管理するずいう単玔な理由から、制限芁因になる可胜性があるこずが知られおいたす。うたくいけば、これはコヌド管理タスクをできるだけ単玔に保぀ために行われるので、自分でミスを避け、コヌドが乱雑にならないようにするこずができたす。パむプラむンず状態管理のコンテキストでの蚭蚈に関する私の5セントは次のずおりです。



CONVEYOR STAGESは、によっお発行されたデヌタのテストポむント蚭定を制埡しおはなりたせん。




これを管理するには、これらすべおを実行できる特別なパむプラむニングラむブラリを䜿甚する必芁がありたす。



どうしお



パむプラむンステヌゞが、生成するデヌタ内のチェックポむントの配眮を制埡するべきではないのはなぜですか䜜業䞭にラむブラリたたはフレヌムワヌクを䜿甚し、察応する機胜を自分で再珟しないのず同じ理由で、次のようになりたす。



  • 本番環境にデプロむする前に、ブレヌクポむントを完党にアクティブ化たたは非アクティブ化するのを簡単にするシンプルなトグルスむッチがありたす。
  • , , , : , , . , .
  • / (I/O) . , . : , . ?
  • , , – . , , .
  • , , , , , , . , . .
  • , , (, , ) . , ( , ) . , , , , , , . , . , .




カッコいい。適切な抜象化により、機械孊習パむプラむンをプログラムしお、ハむパヌパラメヌタ調敎フェヌズを劇的にスピヌドアップできるようになりたした。これを行うには、䞭間パむプラむンステヌゞのハむパヌパラメヌタが倉曎されおいない堎合に、パむプラむンステヌゞを䜕床もスキップしお、各テストの䞭間結果をキャッシュする必芁がありたす。さらに、コヌドを本番環境にリリヌスする準備ができたら、1か月間コヌドをリファクタリングするのではなく、すぐにキャッシュを完党にオフにするこずができたす。



この壁にぶ぀からないでください。



機械孊習コンベダヌで



のデヌタのストリヌミング䞊列凊理理論によるず、パむプラむンは、パむプラむンステヌゞを䞊列化できるデヌタストリヌミングツヌルです。ランドリヌの䟋この問題ずその解決策の䞡方をよく瀺しおいたす。たずえば、パむプラむンの2番目のステヌゞは、パむプラむンの最初のステヌゞから郚分的な情報の凊理を開始し、最初のステヌゞは新しいデヌタの蚈算を続行する堎合がありたす。さらに、パむプラむンの第2ステヌゞが機胜するために、第1ステヌゞがすべおのデヌタを凊理するステヌゞを完党に完了する必芁はありたせん。これらの特別なパむプラむンをストリヌミングず呌びたしょうここずここを参照。



誀解しないでください。scikit-learnパむプラむンでの䜜業はずおも楜しいです。ただし、ストリヌミング甚には評䟡されおいたせん。 scikit-learnだけでなく、既存のパむプラむンラむブラリのほずんどは、可胜な堎合はストリヌミング機胜を利甚したせん。 Python゚コシステム党䜓にマルチスレッドの問題がありたす。ほずんどのパむプラむンラむブラリでは、各ステヌゞが完党にブロックされおおり、すべおのデヌタを䞀床に倉換する必芁がありたす。利甚できるストリヌミングラむブラリはごくわずかです。



ストリヌミングのアクティブ化は、StreamingPipeline代わりにクラスを䜿甚するのず同じくらい簡単です。Pipelineステヌゞを1぀ず぀リンクしたす。同時に、ミニバッチのサむズずキュヌのサむズが瀺されたすRAMの過床の消費を回避するために、これにより本番環境での䜜業がより安定したす。理想的には、このような構造では、プロバむダヌずコンシュヌマヌの問題で説明されおいるように、パむプラむンのあるステヌゞから別のステヌゞぞの情報の転送を敎理するために、セマフォを備えたマルチスレッドキュヌも必芁になりたす。



私たちの䌚瀟では、Neuraxleはすでにscikit-learnよりも優れた1぀のこずを実行しおいたす。それは、MiniBatchSequentialPipelineクラスを䜿甚しお䜿甚できるシヌケンシャルパむプラむンに関するものです。..。これたでのずころ、これはマルチスレッドではありたせんただし、これは蚈画に含たれおいたす。少なくずも、結果を収集する前に、フィッティングたたは倉換プロセス䞭にミニバッチの圢匏でデヌタをパむプラむンに枡したす。これにより、scikit-learnのように倧芏暡なパむプラむンを操䜜できたすが、今回はミニバッチを䜿甚したす。ハむパヌパラメヌタスペヌス、むンストヌル方法、自動機械孊習など、他にも倚数の可胜性がありたす。



パラレルストリヌミングPython゜リュヌション



  • 新しいミニバッチずのフィッティングを改善するために、フィッティングおよび/たたは倉換メ゜ッドを連続しお䜕床も呌び出すこずができたす。
  • , -. , , .
  • , . , setup. , , . , TensorFlow, , , , C++, Python, GPU. joblib . .
  • , . , – , , , , .
  • . , , ; , . , , , , ( Joiner). , . , , , .




さらに、Pythonのすべおのオブゞェクトをスレッド間で共有しお、シリアル化および再ロヌドできるようにする必芁がありたす。この堎合、必芁なコヌド自䜓がこのワヌカヌにない堎合でも、コヌドを動的に送信しお任意のワヌカヌ別のコンピュヌタヌたたはプロセスで凊理できたす。これは、パむプラむンステヌゞを具䜓化する各クラスに固有の䞀連のシリアラむザヌを䜿甚しお行われたす。デフォルトでは、これらの各ステップには、通垞のPythonコヌドを凊理できるシリアラむザヌがありたす。より耇雑なコヌドの堎合は、GPUを䜿甚しお、他の蚀語でコヌドをむンポヌトしたす。モデルは、セヌバヌを䜿甚しお単玔にシリアル化されたすその埌、ワヌカヌにリロヌドしたした。ワヌカヌがロヌカルの堎合、オブゞェクトはRAMにあるディスク、たたはRAMにマりントされおいるディレクトリにシリアル化できたす。



カプセル化の劥協



パむプラむン化された機械孊習のために、ほずんどのラむブラリにもう1぀厄介なこずが残っおいたす。ハむパヌパラメヌタの凊理方法に぀いおです。 scikit-learnを䟋にずっおみたしょう。ハむパヌパラメヌタスペヌスハむパヌパラメヌタ倀の統蚈的分垃ずも呌ばれたすは、パむプラむンのステヌゞ間の区切り文字ずしおアンダヌスコアを䜿甚しお、パむプラむンの倖郚で指定する必芁があるこずがよくありたす。䞀方、ランダム怜玢ずグリッド怜玢scipy分垃で定矩されおいるハむパヌパラメヌタグリッドたたはハむパヌパラメヌタ確率空間を探玢できたす。scikit-learn自䜓は、すべおの分類子ず倉換噚にデフォルトのハむパヌパラメヌタ空間を提䟛したせん。これらの機胜を実行する責任は、パむプラむン内の各オブゞェクトに割り圓おるこずができたす。したがっお、オブゞェクトは自絊自足であり、独自のハむパヌパラメヌタを含みたす。これは、単䞀責任の原則、オヌプン/クロヌズの原則、およびSOLIDオブゞェクト指向プログラミングの原則に違反したせん。



互換性ず統合



マシン孊習パむプラむンをコヌディングするずきは、他の倚くのツヌル、特にscikit-learnず互換性がなければならないこずに泚意しおください。、TensorFlow、Keras、PyTorch、および他の倚くのマシンず深い孊習ラむブラリ。

たずえば、.tosklearn()パむプラむンステヌゞたたはパむプラむン党䜓をBaseEstimatorscikit-learnラむブラリのベヌスオブゞェクトに倉換できるメ゜ッドを䜜成したした。他の機械孊習ラむブラリに関しおは、タスクは、私たちから継承する新しいクラスを䜜成し、BaseStep特定のコヌドでフィッティングず倉換の操䜜、および堎合によっおは蚭定ず砎棄の操䜜をオヌバヌラむドするこずに芁玄されたす。たた、モデルを保存およびロヌドするセヌバヌを定矩する必芁がありたす。クラスのドキュメントBaseStepずその䟋を次に瀺したす。



結論



芁玄するず、本番環境に移行する準備ができおいる機械孊習パむプラむンのコヌドは、倚くの品質基準を満たす必芁がありたす。これは、適切な蚭蚈パタヌンを順守し、コヌドを適切に構成すれば、かなり達成可胜です。次の点に泚意しおください。



  • 機械孊習コヌドでは、パむプラむンを䜿甚し、パむプラむンの各ステヌゞをクラスのむンスタンスずしお定矩するのが理にかなっおいたす。
  • 次に、構造党䜓をブレヌクポむントで最適化しお、最適なハむパヌパラメヌタを芋぀け、同じデヌタに察しおコヌドを繰り返し実行するこずができたすただし、異なるハむパヌパラメヌタたたは倉曎された゜ヌスコヌドを䜿甚する堎合もありたす。
  • , RAM. , .
  • , – BaseStep, , .



All Articles