はじめに
SageMaker のリアルタイム推論エンドポイントで使用している(モデルコンテナにインストールされている)全ての Python パッケージの、パッケージ名とバージョンの一覧を取得したいというタイミングがありました。
その際にやったことをまとめます。
やったこと
リアルタイム推論エンドポイントの推論コード(カスタムスクリプト)内に、以下の Python コードを仕込んで推論を実行すると、ログ(CloudWatch Logs)にpip freeze
の形式で結果が出力されます。
import subprocess
result = subprocess.run(['pip', 'list', '--format', 'freeze'], stdout=subprocess.PIPE, text=True).stdout
print(result)
また、エンドポイントから S3 へアクセス可能な場合、以下のように S3 へテキストファイルを出力することもできます。
import boto3
import subprocess
result = subprocess.run(['pip', 'list', '--format', 'freeze'], stdout=subprocess.PIPE, text=True).stdout
s3_client = boto3.client('s3')
bucket_name = '<S3バケット名>'
file_name = 'pip_freeze_output.txt'
s3_client.put_object(Bucket=bucket_name, Key=file_name, Body=result)
お行儀が悪くないか?
本来、推論エンドポイントのモデルコンテナ内部に直接アクセスしたい場合は、AWS Systems Manager (SSM) を使用するように公式ドキュメントで言及されています。
この AWS Systems Manager (SSM) を使用するには、カスタマーサポートに連絡してアカウントをホワイトリストに登録してもらうという手順を踏む必要があります。
この辺りの公式ドキュメントの記載を全無視して、モデルコンテナ内部で、Python のsubprocess
でコマンド実行しちゃっていいの?という疑問はありました。
AWSサポートに問い合わせてみた
AWSサポートに問い合わせてみたところ、Python のsubprocess
でコマンド実行しても問題ないとのことでした。
むしろ、AWSサポートのエンジニアからも「Python のsubprocess
でコマンド実行する方が手っ取り早いよ」と提案されました。
聞いてみるもんですね。