tropicbirdのブログ

データサイエンスとかに関するメモ

AWSとGPUとGCPのGPU(個人利用の場合)

GCPGPUを何回申請しても、割当1つしか認めてもらえなかったが、AWSなら大きめのGPUの申請が一発で通った。

GCPは法人メインだから個人利用者へのGPUの割当が厳しい」という話をTwitterで見たので、そうなのかもしれないです。試しにGoogleカスタマーサービス(?)にGPU割当を相談してみましたがダメでした。

個人でクラウドGPUを使うにはAWS一択なのだろうか。高い。。

GCPで立てたVMにGCSの認証を有効にする方法 解決法⇒ ResumableUploadAbortException: 403 Provided scope(s) are not authorized

エラーメッセージ

ResumableUploadAbortException: 403 Provided scope(s) are not authorized

が出る原因はVMに対してGCSの認証がうまくできていなかったため。
対処方法は以下の通り。

VMのターミナル上で

gcloud init

とし、

Choose the account you would like to use to perform operations for 
this configuration:
 [1] XXXXXXXXXX-compute@developer.gserviceaccount.com
 [2] Log in with a new account
Please enter your numeric choice:

の選択画面で2を選択して既存のGCPのプロジェクトでログインする。

↓ソース
cloud.google.com

JupyterLabで「Unexpected error while saving file」や「No space left on device」などのエラーが発生した時の対処方法

課題

GCP の AI Platform で JupyterLabを使っていた際に「Unexpected error while saving file」や「No space left on device」などのポップアップが表示され、JupyterLab上での操作ができなくなりました。

解決方法

原因はメモリかハード容量が足りなくなっているためです。私の場合はハード容量に空きをつくることで解決しました。注意点としては、ターミナルでファイルを削除しても、削除したファイルは隠しフォルダ(.local)の中のTrashフォルダに移動されるだけなので、ハード容量の空きは増えません。そのため、ハードの空き容量を増やすには、Trash内のファイルも削除する必要があります。やり方は以下の通りです。

1.ハード容量の空きが無い状態になっているかを確認します。

(base) jupyter@XXXX:~$ df


2.ターミナルを使って不要なファイルを削除します。

(base) jupyter@XXXX:~$ rm <不要なファイル>


3.ファイルを削除後も、ハード容量の空きが無い状態が続いていることを確認します。

(base) jupyter@XXXX:~$ df


4.どこのディレクトリで容量を消費しているのかを確認します。

(base) jupyter@XXXX:~$ du -hs .[^.]*


5.先ほど削除したデータが保存されているTrashまで移動します。

(base) jupyter@XXXX:~$ cd .local/share/Trash/files


6.Trash内のファイルを全て削除すると、JupyterLabで発生していたエラーが消え、JupyterLabの操作が再びできるようになります。

(base) jupyter@XXXX:~/.local/share/Trash/files$ rm *


7.ハード容量の空きが増えていることが確認できればOKです。これでJupyterLabで発生していたエラーが消え、JupyterLabの操作が再びできるようになります。

(base) jupyter@XXXX:~/.local/share/Trash/files$ cd
(base) jupyter@XXXX:~$ df

Anaconda環境でgeopandasを使ってshp(シェープ)ファイルを読み込む際に発生するEPSGに関するエラーの対処方法

はじめに

Anaconda環境でgeopandasを使ってshp(シェープ)ファイルを読み込む際に、たまに以下のようなエラーメッセージが出てshpファイルを読み込めない場合があります。

CRSError: Invalid projection: EPSG:4326: (Internal Proj Error: proj_create: SQLite error on SELECT name, type, coordinate_system_auth_name, coordinate_system_code, datum_auth_name, datum_code, area_of_use_auth_name, area_of_use_code, text_definition, deprecated FROM geodetic_crs WHERE auth_name = ? AND code = ?: no such column: area_of_use_auth_name)

geopandasはpyprojパッケージを使って座標系・空間参照のデータベース(EPSG database)を参照しているのですが、その参照先が間違っている場合に発生するようです。

解決方法

import pyproj
print(pyproj.datadir.get_data_dir())

の出力が

C:/Users/USERNAME/anaconda3/envs/ENVNAME/lib/site-packages/pyproj/proj_dir/share/proj

の場合、

pyproj.datadir.set_data_dir("C:/Users/USERNAME/anaconda3/envs/ENVNAME/Library/share/proj")

としてpyprojの参照先を現在のAnaconda環境下のLibrary/share/projに変更すると、解決しました。

参考サイト:
CRSError: Invalid projection: EPSG:4326 · Issue #1887 · geopandas/geopandas · GitHub

Sen2Corを使って衛星画像Sentinel-2のL1CをL2Aに変換する方法

はじめに

フリーで使える中解像度の衛星画像データとして、Sentinel-2(分解能10m~)があります。人工衛星Sentinel-2は2015年6月に打ち上げられ、打ち上げ当初からL1Cというタイプの衛星画像が公開されています。L1Cタイプの衛星画像とは、簡単に言うと生データのようなものです。


一方で、2017年3月頃から大気の影響を補正したL2Aタイプの衛星画像の提供も順次開始されています。ヨーロッパ地域から始まり、日本の範囲については2018年12月頃以降のL2Aタイプの衛星画像が提供されています。逆に言うと、例えば日本の2017年分のL2Aタイプの衛星画像は提供されていません。


しかし、自力でL1CをL2Aに変換することは可能です。


L2AはSen2Corというプログラムを使ってL1Cから変換されており、Sen2Corプログラム自体は公式(欧州宇宙機関)が公開しているからです。


この投稿では、Sen2Corを使ってL1Cタイプの衛星画像をL2Aタイプに変換する方法を説明します。ちなみに、PC環境はWindowsです。

1. Sen2Corのインストール

欧州宇宙機関が提供するSen2Corのダウンロードサイトに進み、Sen2Cor_v2.8を選択します。
f:id:tropicbird:20210307153249j:plain


ページの下の方に進むと、インストーラーの説明があるので、PCのOSに合ったインストーラーを任意の場所にダウンロードします。zipファイルを解凍しておきます。
f:id:tropicbird:20210307152732j:plain


zipファイルを解凍しておきます。
f:id:tropicbird:20210307155545p:plain


↓公式サイトのSen2Corインストーラーです。ここからもダウンロードできます。
Windows用:http://step.esa.int/thirdparties/sen2cor/2.8.0/Sen2Cor-02.08.00-win64.zip
Linux用:http://step.esa.int/thirdparties/sen2cor/2.8.0/Sen2Cor-02.08.00-Linux64.run
Mac用:http://step.esa.int/thirdparties/sen2cor/2.8.0/Sen2Cor-02.08.00-Darwin64.run

2. Sentinel-2 L1Cの衛星画像を取得する(※画像を取得済みの場合➝3.へ)

Sentinel-2の衛星画像を提供しているサイトは色々ありますが、今回はCopernicus Open Access Hubから取得します。まずサイトにアクセスし、Open Hubを選択します。
f:id:tropicbird:20210307153848j:plain


Open Hubに進んだら、右上からアカウントを作成します。
f:id:tropicbird:20210307154158j:plain


アカウントを作成できたら、衛星画像がほしい範囲を選択します。
f:id:tropicbird:20210307154430j:plain


左上の三本線を選択します。
f:id:tropicbird:20210307154608j:plain


Sensing period(画像の撮影時期)かIngestion period(画像がサイトで公開された時期)の項目に画像の期間を選択します。Mission: Sentinel-2にチェックを入れます。Product TypeはS2MSI1Cを選択します。雲量(Cloud Cover %)を任意の値(例えば10%以下は、[0 TO 10])で入力します。


最後に虫眼鏡マークを選択すると、設定した条件に合うSentinel-2のL1Cの衛星画像の一覧が表示されます。この中から必要なデータを選択し、任意の場所にzipファイルをダウンロードし、zipファイルを解凍し、「~.SAFE」というフォルダが生成されるのを確認します。
f:id:tropicbird:20210307163946p:plain

3. L1CデータをL2Aデータに変換

コマンドプロンプトを開き、Sen2Corのzipファイルを解凍したディレクトリに移動し、ディレクトリ内にL2A_Process.batファイルがあることを確認します。
f:id:tropicbird:20210307160411j:plain


L2A_Process.batが確認できたら、コマンドライン

L2A_Process.bat ダウンロードしたL1C画像の.SAFEフォルダのパス

を入力します。


あとは変換作業を待つのみです。パソコンのスペック次第ですが、ノートPC用の第10世代Core-i7だと10分くらいで完了します。以下の画像のような感じで進捗が表示されます。
f:id:tropicbird:20210307160819p:plain


最後にApplication terminated successfullyの文字が出れば成功です。
f:id:tropicbird:20210307162137p:plain


L1Cタイプの画像を保存していたフォルダを確認すると、L2Aタイプの画像が生成されていることが確認できます。
f:id:tropicbird:20210307164212p:plain

Jupyterのカーネルに設定されたPythonのバージョンを確認する方法

はじめに

Jupyter上で複数の仮想環境を使うために、以下のサイト等を参考にして複数のバージョンのPythonを pyenvで作成した。
Jupyterで複数カーネルを簡単に選択するための設定 - Qiita
Python:venv + pyenvでの環境構築 - 無粋な日々に
そして、Jupyter上で各カーネルPythonのバージョンを

!python --version

で確認したら、ホストのPythonのバージョンが表示されて少し混乱したので、その時の備忘録です。

<前提条件>
ホスト環境:Python 3.8.6
仮想環境:Python 3.7.6

詳細と原因

カーネルを仮想環境にして、Jupyter上で

!python --version

とすると、

Python 3.8.6

が出力されたので、カーネルの設定に失敗したかと思った。


少し冷静になって、

import sys
print(sys.executable)

とすると、

'/home/username/.pyenv/versions/3.7.6/bin/python3.7'

が出力されたので、Jupyter上はPython3.7.6になっていることが確認できた。

ポイント

Jupyter上で

!python --version

としても、ホストのPythonのバージョンが表示される。Jupyterのカーネルで設定した環境のPythonのバージョンを確認したいときは、

import sys
print(sys.executable)

を使う。

GPUをWSL2とDockerで使えるようにする方法

はじめに

Dockerの初学者です。Dockerを使い始めるにあたり、WSL2とDockerでGPUを使えるようするために環境の構築を行ったのですが、エラーが連発したので、その記録と解決方法を紹介します。

WSL2上でdockerを使ってGPUを使用する方法は、NVIDIA公式のCUDA on WSL :: CUDA Toolkit Documentationに詳しく説明されています。日本語だとついにWSL2+docker+GPUを動かせるようになったらしいので試してみる - Qiitaが分かりやすいです。私のPCの環境はWindows10 Homeです。

エラー内容①

Docker Desktop for Windowsをインストールして、WSL2と連携したはずなのにWSL2上で以下のコマンドを入力してもDockerが反応しなかった。

$ sudo service docker stop
$ sudo service docker start
エラー内容②

WSL2上でGPUが認識されているか確認するためにNVIDIA公式に記載の以下のコードを入力しても、

$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

以下のようなエラーが発生した。

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
原因(おそらく)

NVIDIA公式の方法に従って作業をする前に、Docker Desktop for Windowsを先にPCにインストールしていたため。

解決方法

1. PCにDocker Desktop for Windowsがインストール済みの場合は、「アプリと機能」からDocker Desktopをアンインストールする。


2.NVIDIA公式の方法に従って作業する。この時、以下のコードをところで、「既にdockerがマシンに入っているからトラブル起きる可能性あるよ(意訳)」という警告文が発生し、それでも進めようとすると、「WSL2環境があるときにはDocker Desktop for Windowsを使いましょう。(意訳)」と警告文が出るけど無視して進める。

$ curl https://get.docker.com | sh


3.引き続きNVIDIA公式の方法に従って作業し、

$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

の箇所で、以下のエラーが発生した場合は、

docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.
ERRO[0000] error waiting for container: context canceled

以下のようにディレクトを作成してマウントする。

$ sudo mkdir /sys/fs/cgroup/systemd
$ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

すると、

$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

が正常に動作します。以上です。

【解決方法の参考サイト】
cuda - GPU/Docker not working Ubuntu 20.04 in the WSL 2 of Windows - Ask Ubuntu
https://github.com/docker/for-linux/issues/219#issuecomment-375160449