web-dev-qa-db-ja.com

並列Pipインストール

私たちのDjangoプロジェクトは巨大になっています。私たちは何百ものアプリを持っており、たくさんのサードパーティのpythonパッケージを使用しており、その多くはCをコンパイルする必要があります。私たちのメジャーリリース用の新しい仮想環境を作成する必要がある場合、デプロイには長い時間がかかります。そうは言っても、Pipから始めて、処理を高速化することを目指しています。パッケージを並行してインストールするPipのフォークを知っている人はいますか。 ?

これまでに行った手順:

  • 私はこれをほとんど成功せずに行うプロジェクトを探しました。私はこのGithubGistを見つけました: https://Gist.github.com/197172 しかし、結果は私たちのシングルスレッドの友人とほとんど同じです。

  • 次に、GithubでPipプロジェクトを見つけ、フォークのネットワークを調べて、自分がやろうとしていることを実行することに言及しているコミットを見つけることができるかどうかを確認し始めました。そこはめちゃくちゃです。私はそれをフォークし、必要に応じて自分で並列化しようとします。それを行うのに時間を費やすことは避けたいだけです。

  • Ep.ioのDjangoCon2011で、デプロイに関する説明を見て、CをコンパイルしてPypiをミラーリングする代わりに、pipの並列化、.soファイルの出荷について言及しましたが、その方法や使用方法については触れていませんでした。

25
Kyle

展開プロセスを分析して、時間が実際にどこに行くのかを確認しましたか?複数の並列pipプロセスを実行しても、それほど高速化されないことに驚いています。

PyPIのクエリとパッケージの検索に時間がかかる場合(特にGithubやその他のソースからダウンロードする場合)、独自のPyPIを設定すると便利な場合があります。自分でPyPIをホストし、requirements.txtファイルに以下を追加できます( docs ):

--extra-index-url YOUR_URL_HERE

または、公式のPyPIを完全に置き換える場合は、次のようにします。

--index-url YOUR_URL_HERE

これにより、すべてのパッケージが近くのマシンで見つかるため、ダウンロード時間が短縮される可能性があります。

PILなどのCコードを使用してパッケージをコンパイルすることにも多くの時間がかかります。これがボトルネックであることが判明した場合は、複数のプロセスでコードをコンパイルすることを検討する価値があります。コンパイルされたバイナリをマシン間で共有できる場合もあります(ただし、オペレーティングシステム、CPUワード長など、多くのものが類似している必要があります)。

7
Simeon Visser

並列ピップインストール

この例では、 xargs を使用して、ビルドプロセスを約4倍並列化します。以下のmax-procsを使用して、並列化係数を増やすことができます(コアの数とほぼ同じに保ちます)。

あなたがしようとしているなら例えば何度も実行しているイメージングプロセスを高速化すると、毎回これを実行するよりも、結果を直接イメージングする方が簡単で帯域幅の消費量が確実に少なくなるか、 pipを使用してイメージを構築できます- t または virtualenv

パッケージを並行してダウンロードしてインストールします。一度に4つ:

xargs --max-args=1 --max-procs=4 Sudo pip install < requires.txt

注:xargsは、Linuxディストリビューションごとに異なるパラメーター名を持っています。詳細については、ディストリビューションのマニュアルページを確認してください。

ヒアドキュメント:を使用してインライン化された同じもの

 cat << EOF | xargs --max-args=1 --max-procs=4 Sudo pip install
 awscli
 bottle
 paste
 boto                                                                         
 wheel
 twine                                                                        
 markdown
 python-slugify
 python-bcrypt
 arrow
 redis
 psutil
 requests
 requests-aws
 EOF

警告:複数のpipがまったく同時に同じ依存関係をインストールしようとすると、このメソッドの速度がパッケージマニフェストを混乱させる可能性がほとんどありません(ディストリビューションによって異なります)が、4つだけを実行している場合はほとんどありません時間。 pip install --uninstall depnameで簡単に修正できます。

9
Jamieson Becker

Jamieson Beckerの回答に基づいて、次のコードはPipの並列ダウンロードを実行し、パッケージをすばやくインストールします。

まず、パッケージを配布( "dist")ディレクトリに並行してダウンロードします。これは、競合することなく簡単に並行して実行できます。印刷される各パッケージ名は、ダウンロード前に印刷されるため、デバッグに役立ちます。さらにヘルプが必要な場合は、-P9-P1に変更して、順番にダウンロードしてください。

ダウンロード後、次のコマンドはPipにパッケージをインストール/更新するように指示します。ファイルはダウンロードされず、高速ローカルディレクトリからフェッチされます。

現在のバージョンのPip1.7、およびPip1.5と互換性があります。

パッケージのサブセットのみをインストールするには、「catrequirements.txt」ステートメントをカスタムコマンドに置き換えます。 'egrep -v githubrequirement.txt'

cat requirements.txt | xargs -t -n1 -P9 pip install -q --download ./dist

pip install --no-index --find-links=./dist -r ./requirements.txt
9
johntellsall

ビルドシステム(Jenkinsなど)ですべてをビルドして、ビルド固有の仮想環境ディレクトリにインストールする場合に役立ちますか?ビルドが成功したら、仮想環境を再配置可能にし、tarballを実行して、結果のタブラルを「released-tarballs」ストレージにプッシュします。デプロイ時に、最新のtarballを取得し、宛先ホストで解凍する必要があります。そうすれば、実行できるようになります。したがって、tarballをダウンロードするのに2秒、宛先ホストで解凍するのに0.5秒かかる場合、デプロイメントには2.5秒かかります。

このアプローチの利点は、すべてのパッケージのインストールが展開時ではなくビルド時に行われることです。

警告:仮想環境にビルド/コンパイル/インストールするビルドシステムワーカーは、ターゲットハードウェアと同じアーキテクチャを使用する必要があります。また、本番ボックスプロビジョニングシステムは、一部のPythonパッケージに含まれる可能性のあるさまざまなCライブラリの依存関係を処理する必要があります(たとえば、PILではその前にlibjpegをインストールする必要があります) JPEG関連のコードをコンパイルできます。また、libjpegがターゲットボックスにインストールされていない場合は問題が発生します)

それは私たちにとってうまくいきます。

仮想環境を再配置可能にする:

virtualenv --relocatable /build/output/dir/build-1123423

この例ではbuild-1123423はビルド固有の仮想envディレクトリです。

3
Pavel Repin

他のすべての回答は、 pipenvの使用を支持して非推奨と見なすことができます。

通常のpipインストールの最大の制約は、依存関係グラフがないことです。 pipenvを使用すると、依存関係グラフ全体を作成することでこれが解決されるため、競合しないすべての依存関係を問題なく並行してインストールできます。

基本的な使用法はpipに似ています:

pipenv install package packages

要件ファイルからの移行は、次のように簡単です。

pipenv install -r requirements.txt

インストール中に、pipenvは依存関係グラフを生成し、手動でインストールされた依存関係をPiplockファイルに保存し、依存関係グラフ全体をPipfile.lockに保存します。これらがリポジトリに追加されると、他の開発者は次のコマンドを実行するだけで作業を再開できます。

pipenv install
0
Wolph