日々精進

新しく学んだことを書き留めていきます

windows11 homeでext4.vhdxの容量を削減する

WSL2を使っていると、ext4.vhdxというファイルの容量がすごく大きくなることがある。これを小さくする方法としてOptimize-VHDを使う方法がよく紹介されているが、これはHyper-Vの機能の一つらしく、Hyper-VはWindows11 Proでないと使えないのでWindows11 Homeではこの方法は使えない。

blog.dreamhive.co.jp

以下を参考にdiskpartコマンドでext4.vhdxを最適化すると容量削減できた。

qiita.com

/var/lib/docker/overlay2の容量が大きいので削減したい

/var/lib/docker/overlay2の容量をdu -sh /var/lib/docker/overlay2で調べたところかなり大きかったのでびっくりしたが、以下によるとduでは正確な容量を調べられないらしい。

www.creationline.com

/var/lib/docker/overlay2の容量を手っ取り早く削減するためには、ビルドキャッシュを削除すれば良い。

docker system dfを実行してBuild Cacheが多ければdocker builder pruneを実行してcacheをクリアする。

参考:

qiita.com

nvidia/cuda:11.5.2-devel-ubuntu20.04上でRAPIDSを動かすと「RuntimeError: Failed to dlopen libcuda.so」エラー

DockerHubのnvidia/cuda:11.5.2-devel-ubuntu20.04をベースイメージとしてコンテナを作り、その上でcudfを動かすと掲題のエラーが出た。

原因はLD_LIBRARY_PATHで指定しているcudaのパスが間違っていること。多分ベースイメージでは以下の環境変数が設定されているが、/usr/local/nvidiaフォルダが存在しない。。

LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64

以下のように直すとエラーがなくなった。

LD_LIBRARY_PATH=/usr/local/cuda/lib64

参考:

github.com

SageMakerでTrainingJobを起動すると「ClientError: Failed to invoke sagemaker:CreateProcessingJob. Error Details: The account-level service limit 'ml.m5.2xlarge for processing job usage' is 20 Instances」エラー

TrainingJobを起動したのに、エラーメッセージは「CreateProcessingJobを実行したけど、processing jobのservice limitに引っかかったよ」と言っている。

TrainingJobを起動したはずなのになぜ・・と思ったら、TrainingJobは裏でProcessingJobを起動しているっぽい。

TrainingJobを起動した後、ProcessingJobの一覧を確認するとTrainingJobと同数のProcessingJobが起動している・・

掲題のエラーが発生した状況は以下。

  • TrainingJobを20インスタンス実行中
  • 追加でProcessingJobを1インスタンス起動

逆に、以下のケースではエラーが起きなかった。

  • ProcessingJobを1インスタンス実行中
  • TrainingJobを20インスタンス起動

ProcessingJob起動時のみProcessingJobの「すべての処理ジョブにおける合計インスタンス数」がチェックされているっぽい。起動順序によってエラーになる・ならないが変わるのは何か変な感じ

docs.aws.amazon.com

daskで何故か使用メモリ量が大幅に増えるケースがある

手元のデータセットで以下のコードを実行すると使用メモリ量が2GB程度増えた。

    def _get_difference(self, num_feat_names: List[str], num_feats: DataFrame) -> DataFrame:
        def diff(df: DataFrame) -> DataFrame:
            return df.diff(1)
        npartitions: int = min(os.cpu_count() * 3, int(len(num_feats) / 100))
        ddf: dd.DataFrame = dd.from_pandas(num_feats, npartitions=npartitions).set_index("customer_ID")
        ddf = ddf[num_feat_names].map_overlap(diff, 2, 0)
        ddf = ddf.rename(columns={col: col + "_diff_1" for col in num_feat_names})
        ddf = ddf.groupby("customer_ID").last()
        return ddf.reset_index().compute()

上記コードの、

ddf = ddf[num_feat_names].map_overlap(diff, 2, 0)

ddf[num_feat_names] = ddf[num_feat_names].map_overlap(diff, 2, 0)

に変更すると使用メモリ量の増加が24GB程度になった(!)なぜだ・・

compute()した後の行数・列数は同じだし、ddfオブジェクトを削除してGCを実行しても使用メモリ量はほぼ変わらず。

daskが内部で持っているデータを解放できていないように見える。

こんなケースがあるとdask使いづらいな。。