「データサイエンスのプログラムでは教えてくれないが知っておくべき8つのこと−パート1」

8 things you should know in data science programs - Part 1

データサイエンス 101

MITはこれを「あなたのCS教育の欠落したセメスター」と呼んでいます

Midjourneyを使用して作成されました。

おそらく、データサイエンスの80/20ルールについて聞いたことがあるか、経験したことがあるかもしれません:

データサイエンティストの時間の20%は分析に費やされます。残りの時間の80%は単純にデータの準備に費やされます。

私の場合、実際には90/10かもしれません。それが私の仕事の現実です-私たちは非常に複雑なデータセットを扱っています。

しかしそれは、データサイエンスのプログラムやブートキャンプ、コースがあなたを準備するものではありません。

おそらく、複雑な予測モデルの使用方法、非構造化データのクラスタリング、および時系列の分析方法を学んでいます。この知識がなければ、あなたはデータサイエンティストではありません。

しかし、これらのテクニックを使用する時間の80%は費やされません。代わりに、データの収集、移動、クリーニング、データベースの設定、リモートコンピューティング環境の管理、および多くの他の非分析的なタスクに取り組むことになります。

問題は、これらのタスクに対処するためのツールがどのように存在するかを知らないことが、生産性に大きな影響を与え、プロジェクトの成果に潜在的な影響を与える可能性があることです。実際、MITはこのギャップを埋めるために専用のコースを開設しており、そのコースは適切に「あなたのCS教育の欠落したセメスター」と呼ばれています(これはここで取り上げられているトピックのいくつかについて考え方に影響を与えた素晴らしいコースです)。

この投稿は、80%のブロック内で働きながら(主に)学んだ実践的なレッスンについて話すシリーズのスタートです。目標は、これらのタスクに対処するためのツールがどのように存在するかを探索し、私のキャリアで学んだいくつかの良い実践を共有することです。

以下は、カバーする内容です:

パート1(この投稿):

  1. Linuxの使用に慣れる
  2. リモートコンピューティングシステムを効果的に使用する
  3. プロジェクトごとに別々のPython環境を使用する
  4. コードのデバッグとプロファイリングの方法を知る

パート2(近日公開):

  1. 再現性について気をつけて将来の自分をサポートする
  2. データとモデルを含むすべてをバージョン管理する
  3. ML実験トラッキングツールで実験を組織する
  4. コードをテストしてドキュメント化する

別の将来の投稿では、これらのトピックの各々について詳しく説明します。

1. Linuxの使用に慣れる

お使いのオペレーティングシステムがWindowsであっても、Linuxの基本的な作業知識は非常に役立つ理由がたくさんあります。

AWSやGCPなどの共有計算環境は通常Linuxで実行されます。Linuxにはシェルも付属しており、数少ないコマンドで多くのタスクを解決するのに役立つ強力なツールです。

通常、Software Carpentryのワークショップはシェルの基本コースから始まります。以下は、Software Carpentryがそれについて言及している内容です:

「Unixシェルは、そのユーザーのほとんどが生まれるよりも前から存在しています。それは強力なツールであり、ユーザーが複雑で強力なタスクをいくつかのキーストロークやコードの行で実行できるようにするため、生き残ってきました。ユーザーは、繰り返しタスクを自動化し、小さなタスクを簡単に組み合わせてより大きな、より強力なワークフローに組み合わせることができます。シェルの使用は、高性能コンピューティングを含む幅広い高度なコンピューティングタスクにおいて基本的です。」

以下は、効果的なLinuxユーザーになるために知っておくと役立つ基本事項のリストです。これらは、私が日常的に使用するツールです。

  • ファイルシステムの理解と移動-ディレクトリ構造、ホームディレクトリ、ファイルおよびディレクトリの許可、ファイルリンクなどの概念。
  • $PATH変数と環境変数。
  • 実行中のプロセスのリストを表示し、プロセスを停止または終了する方法。
  • cdlscatlessmkdirmvrmgrepfindなどのファイルとディレクトリを操作するための基本的なシェルコマンド。
  • コマンドをパイプし、コマンドの出力をリダイレクトする方法。
  • nanovimなどのテキストエディタを使用してターミナルでファイルを編集する方法。
  • 基本的なシェルスクリプトを作成して、コマンドを保存し、簡単に再実行できるようにする方法。

これは覚えるのが長いリストのように思えるかもしれませんが、これらのツールを定期的に使用し始めると、それらは自然と身についていきます。

2. リモートコンピューティングシステムを効果的に使用できるようにする

AWS、GCP、Azureなどのリモートコンピューティング環境は、主に2つの理由で便利です。まず、ローカルで利用可能な以上の計算リソースを提供してくれること、そしてコンピュータを常に稼働させる必要がなく、長時間のプロセス(モデルのトレーニングなど)を実行できることです。

リモートコンピューティングシステムを使用するための人気で迅速かつ簡単なアプローチは、リモートマシン上でJupyterノートブックサーバーを実行することです。ただし、この解決策の欠点は、Jupyterノートブックが長時間のプロセスを実行するために設計されていないということです。

一時的なインターネット接続の問題により一部の結果を失ったことがあれば、私の言っていることが分かると思います。

幸いにも、Linuxには長時間のプロセスを実行するために設計されたツールのスイートが用意されています。すでにリモートコンピューティングシステムを使用している場合、または将来的に使用する予定がある場合は、これらのツールに精通しておくことで、将来の大きな問題を回避できます。

リモートコンピューティングシステムを使用する際には、次の2つの主要なアクションを実行します:

  • scprsyncなどのツールを使用してssh経由で接続し、データをやり取りする
  • nohupscreentmuxなどのツールを使用して、リモートマシンから切断してもプロセスが停止しないように管理する

これらのツールを使用すると、まるで自分がその場にいるかのようにリモートマシンでプロセスを実行できるはずです。

3. 各プロジェクトに独立したPython環境を使用する

これは非常にシンプルなアイデアだと思いますが、私の経験では、実際には驚くほど一般的ではありません。

データサイエンティストがよくやる間違いの一つは、まったく仮想環境を使用しないか、あるいはすべてのプロジェクトで共有する1つの環境を使用することです。

Python仮想環境を使用しないことは、必要なサードパーティライブラリがPythonのシステムインストールに直接インストールされることを意味します。これはPythonに依存するシステムタスクに影響を与える可能性があります。最悪の場合、これはオペレーティングシステムを壊す可能性があります。

すべてのプロジェクトにPython仮想環境(venvcondapipenv、お気に入りの仮想環境マネージャーなど)を使用してください。

おそらく多くのプロジェクトで同じ依存関係が共有されているかもしれません。この場合、プロジェクト間で1つの環境を共有することは良いアイデアのように思えるかもしれません。時間とスペースを節約できるからですよね?

それを行うべきではない理由はたくさんあります。以下はその主な理由のいくつかです:

  • 異なるプロジェクト間でライブラリのバージョンの問題に直面するリスクがあります。”依存関係地獄”という言葉を聞いたことがありますか?これは限られた状況のように思えるかもしれませんが、思っている以上によく起こります。
  • どのプロジェクトにどのライブラリが必要かを特定するのが難しくなります。これは特に共同プロジェクトで作業し、環境をチーム全体と共有する必要がある場合に問題になることがあります。

それぞれのプロジェクトに独立した環境を維持することは多くの手間がかかるように思えるかもしれませんが、現在は仮想環境の管理を容易かつシームレスに行うための多くのツールがあります(私のお気に入りはvirtualenvwrapperpipenvです)。自分のワークフローに最適なツールを試してみることを強くお勧めします。

4. コードのデバッグとプロファイリングの方法を知る

コードを書くという事実は、完璧なコードを誰も書かないということです。

おそらく、望んだ動作をしないためにコードの論理を数時間チェックすることがあり、結局は変数を間違えたり、model.eval()を呼び出し忘れたりしたことに気づくことがあります。これは、コードを書く人にとってイライラする現実です。

コードを書くという事実は、完璧なコードを誰も書かないということです。

変なエラーに直面したときの自然な最初のステップは、いくつかのプリント文を使用してコードを反復的にテストすることです。これで問題を特定できることが多いですが、常に手間がかかる解決策ではありません(以前のコードに忘れられたデバッグプリント文が見つかったことがありますか?)。

デバッグツールを入力してください。

デバッガは、コードをステップバイステップで実行し、コード内のすべての変数の状態を調査することができます。基本的には、print文が行うことをシステマティックに行い、ボタンをクリックするだけで実行します。

試してみることができるデバッガのリストは長いです。Pythonのpdb、PyCharmのデバッガ、Visual Studio Codeのデバッガ(私のお気に入り)などがあります。コードの記述を日常的に行う場合、デバッガの使用方法を学ぶことは非常に有用な時間の投資になり、長い目で見れば多くの頭痛を解消できるでしょう。

コードのタイミングとプロファイリング

おそらくコードは期待通りに動作するが、所望の時間よりも長く実行されたり、リソースを多く使用したりするかもしれません。私自身のコーディングでは、最初に動作する解決策を実装することに焦点を当て、コードの最適化については後で考えることが多いです(もちろん、最適化は常に行われるわけではありませんが、将来的にはLLMが私のために解決してくれることを期待しています)。

ここでタイミングとプロファイリングが役立ちます。どちらも同じことを行います-コード内のボトルネックや非効率性を明らかにするために異なるアプローチを使用します。

タイミングは単にコード内の2つのポイント間で経過した時間を測定します。特定の関数の実行にかかった時間を測定するために使用することができます(Pythonのtimeitモジュールには便利な例があります)。

プロファイラにはさまざまな種類がありますが、すべてのプロファイラは同じことを助けます-言い換えれば、各関数呼び出しに費やされた時間を測定するのに役立ちます。Pythonには組み込みのプロファイラcProfileがあり、PalanteerやYappiなどのサードパーティのオプションもあります。

プロファイリングに使用するオプションに関係なく、コードを再記述して最適化する場合は、Pythonのツールボックスにプロファイラを追加することを検討するべきです。

デバッグに関する注意事項

伝統的なコードデバッガでは学習アルゴリズムのデバッグには向いていません。モデルが収束しない、あるいはあまりにもうまくまたはあまりにも悪くパフォーマンスを発揮する場合があります。回帰モデルやクラスタリングアルゴリズムでも理論的にはデバッガを使用できますが、自分自身で実装しなかった限り、アルゴリズム自体はおそらく問題ありません。問題は他の場所にある可能性があります-不適切な学習アルゴリズムの選択、不十分なデータ、不適切なハイパーパラメータなど。

データサイエンスのアルゴリズムのデバッグには、データの理解、アルゴリズムの動作に関する直感、エラー解析などの技術に関する知識の組み合わせが必要です。Andrew Ngはこの素晴らしい講義で学習アルゴリズムのデバッグのヒントを説明しています。このトピックについて別の記事が必要かどうか、コメントでお知らせください。

ここまでお読みいただき、ありがとうございます!この記事を楽しんでいただけたら幸いです。新しい記事を公開した際に通知を受け取りたい場合は、こちらでメール通知の登録を検討してください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more