WhisperをWSL2で動かそうとしたらCUDA errorが出た際の対処作業メモ
元ネタ
はじめに
OpenAIが発表した音声認識モデルをGPU付きのローカルのWSL2で動かそうとしてCUDA errorが出た対処の作業メモです。
手軽にWhisperを動かしたいだけならGoogle Colabで動くので
上記のブログ等を参考に手を動かしてみると早いです。ほんとWhisperすごい。
本ページではローカルのWSL2で動かしたときに遭遇したエラーへの対処を書きます。
環境
環境作成
今回はvenvを利用して環境を作りました。
$ mkdir whisper_run $ cd whisper_run $ python3 -m venv whisper_test $ source ./whisper_test/bin/activate
ドライバ、CUDA Toolkitのアップデート
公式からたどって最新にしておきました。
Whisperのインストール
公式
こちらも公式にしたがいます。
$ pip install git+https://github.com/openai/whisper.git $ sudo apt update && sudo apt install ffmpeg
音声ファイルの準備
今回テスト用に『青空朗読』から音声ファイルをお借りしました。
※音声ファイルはダウンロードできますが、フリー音源ではないのでご注意ください
テストコード
これも公式から。
import whisper model = whisper.load_model("small") result = model.transcribe("rd745.mp3") print(result["text"])
公式からmodelとファイル名を書き換えてます。 上記をsample.pyとして保存。
実行
$ python3 sample.py
実行結果(エラー)
$ python3 sample.py Traceback (most recent call last): File "/home/yiw/dev/whisper_run/sample.py", line 4, in <module> result = model.transcribe("rd745.mp3") File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/transcribe.py", line 88, in transcribe _, probs = model.detect_language(segment) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context return func(*args, **kwargs) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/decoding.py", line 43, in detect_language mel = model.encoder(mel) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 156, in forward x = block(x) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 127, in forward x = x + self.mlp(self.mlp_ln(x)) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/container.py", line 139, in forward input = module(input) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 36, in forward return F.linear( RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasGemmEx( handle, opa, opb, m, n, k, &falpha, a, CUDA_R_16F, lda, b, CUDA_R_16F, ldb, &fbeta, c, CUDA_R_16F, ldc, CUDA_R_32F, CUBLAS_GEMM_DFALT_TENSOR_OP)`
RuntimeError: CUDA error
torchでCUDA使おうとして使えてない。
調査
$ pip list | grep torch torch 1.12.1
torchはpip install git+https://github.com/openai/whisper.git
したときに一緒にインストールされたようだけど、cudaに対応していないものでは?
対策
torchをアンインストール
$ pip uninstall torch
を参考にcuda対応のtourchをインストール。
$ pip install torch --extra-index-url https://download.pytorch.org/whl/cu116
インストール後
$ pip list | grep torch torch 1.12.1+cu116
再実行
$ python3 sample.py Detected language: japanese グリムサク 矢崎玄黒役赤ずきんむかしむかし あるところにちっちゃなかわいい女の子がおりました。その子はちょっと見ただけでどんな人でもかわいくなってしまうような子でしたが、誰よりも一番かわいがっていたのはこの子のおばあさんでした。おばあさんはこの子の顔を見ると何でもやりたくなってしまって、一体何をやったらいいのかわからなくなってしまうほどでした。あるとき、おばあさんはこの子に赤いビロードでかわいいずきんをこじらえてやりました。するとそれがまたこの子にとっても役に合いましたので、それからはもう他のものはちっともかぶらなくなってしまいました。それでこの子はみんなに赤ずきんちゃん、赤ずきんちゃんと呼ばれるようになりました。 (以下略)
動いた!
まとめ
(私の環境では)公式手順だとcuda対応ではないtorchがインストールされてしまっていたので、cuda対応のtourchを入れなおすことで動作しました。
Whisperは多少変な認識もありますが、手軽に日本語の音声認識を使えたことを考えるととても面白いですね。 しかも多言語対応してるって、なんて強力なんだ……。
Hyper-V上のWindows 11 開発環境でWSL2(Ubuntu)を利用するには入れ子仮想化を有効に
はじめに
最近自分のPCをWindows 11にアップデートしました。
Hyper-Vマネージャーを覗くと『Windows 11 開発環境』が利用できるようです。(Windows 10でもあった)
「評価版 Windows 11」が手軽に起動できるので、さらにその環境上でWSL2のUbuntuを起動しようとしたところ、以下のメッセージが表示され起動することができません。
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS
WSL2は内部でHyper-Vを利用するので、今回のHyper-V上の開発環境では「Hyper-V on Hyper-V」の入れ子状態となるため、仮想化機能をHyper-Vに対して有効化する必要があります。
今回はその経緯と対策手順を記載します。
手順1:仮想化有効まえ
Hyper-V 仮想マシンの作成
Hyper-V マネージャーを起動し、「クイック作成...」を選択。
「仮想マシンの作成」から「Windows 11 開発環境」を選択し、「仮想マシンの作成」ボタンを押下。
仮想マシンの起動
対象の仮想マシンを起動。
PowerShellの起動
仮想マシンにログイン後、PowerShellを「管理者モード」で起動。
wslコマンドで起動可能なディストリビューションの確認
wsl --list --online
上記コマンドでWSL2で利用可能なディストリビューションを確認。
実行結果
wslコマンドによる起動:失敗時
wsl --install -d Ubuntu
上記のwslコマンドでUbuntuの起動を試みますが、この時点では仮想化を有効にしていないのでUbuntuのウインドウが起動されるものの、前述の「仮想化機能を有効にしてください」という旨のメッセージが表示され、Ubuntuは利用できません。
起動しないケース
手順2:仮想化有効化まで
この作業はホスト側の作業です。
仮想マシンの名称確認
仮想マシンの名称を確認します。 Hyper-Vマネージャーに表示される名称で問題ないのですが、今回はPowerShellで同じ名称になるかを確認しました。
参考
管理者モードでPowerShellを起動し、以下のコマンドを実行。
Get-VM
ここでは「Windows 11 開発環境_1」を対象に作業を進めます。(作業の都合、名称を変更しています)
仮想化機能を有効にする
「Hyper-V on Hyper-V」の入れ子を可能にするにはPowerShell上で「Set-VMProcessor」コマンドを利用して仮想マシンごとに仮想化を有効にします。
参考URL:入れ子になった仮想化による仮想マシンでの Hyper-V の実行
Set-VMProcessor -VMName "Windows 11 開発環境_1" -ExposeVirtualizationExtensions $true
Set-VMProcessorコマンドの結果
手順3:仮想化有効後
ここの作業は仮想マシン上で行います。
仮想マシンでPowerShellを起動
仮想マシンへログインし、「管理者モード」でPowerShellを起動
wslコマンドによる起動:成功
手順1と同じようにwslコマンドでの起動を試みる。
wsl --install -d Ubuntu
Ubuntuの別ウインドウが起動し、Ubuntuへのログインが確認できました。
※この時点で気づいたんですが、"wsl --install -d Ubuntu"を実行時にUbuntuのディストリビューションはインストール済であるとメッセージにでてますね。
Ubuntu起動成功
手順は以上となります。
まとめ(と追記)
- Windows 11ではHyper-Vで「評価版 Windows 11」が利用できる
- Hyper-V上の「評価版 Windows 11」でWSL2が利用できるが「仮想化有効」のためのコマンドを叩く必要あり
~追記~
- 「評価版 Windows 11」にはすでにWSL2のUbuntuがインストール済みなので、すぐ使えて楽
- 仮想マシン上でのwslコマンドでUbuntuをインストールするにはPowerShellは一般ユーザーでもできた
おわりに
WSL2自体のインストールはかなり簡略化されましたが、WSL2自体をお試しであれこれする環境が欲しかったので、これで環境の汚染や破壊を恐れずに作業できそうです。
Azure Image Builderでイメージビルド中にターミナルを閉じてしまったら
はじめに
Azure Image Builderでイメージビルド中にターミナルを閉じてしまい、ビルドの結果を見失ったのでその対応について書きます。
Azure Image Builderでイメージを作成する
上記サイトを参考にVMイメージのビルドをしてみました。
ただし、上記サイトの日本語ページには誤記があるので下記のサイトを参考に一か所修正してビルドを実施する必要があります。
チュートリアルを開始するのに便利な機能
チュートリアルには実行するコマンドが記載されていますが、コマンドの右上にある「使ってみる」を押すと右ペインにAzure Cloud Shellが起動します。(自分のアカウントでログインすると利用できます)
チュートリアルを試すには便利な機能ですね。 (ただしMicorosoft Learnでのサンドボックスと違い課金される対象ですので注意)
チュートリアルでイメージのビルドを開始してみた
az resource invoke-action \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateWin01 \ --action Run
チュートリアルのなかで、上記コマンドでビルドを開始します。 「15分かかる」とチュートリアルには記載がありますが、私の場合30分以上かかったケースがありましたし、今回は1時間たってもビルドは終了しませんでした。(この時点で何かがおかしい気はしている)
いっこうに終わらないビルド…そして…
ビルドの最中はコマンドは次の操作を受け付けません。 ですが、この最中に自分のPCの通信回線が途切れてしまい、Azure Cloud Shellとの接続が途切れてしまいました。 慌てて再接続を試みましたが、Azure Cloud Shellは新しいセッションとして開始されてしまい、ビルドの結果が分からなくなってしまいました。
ビルドはどうなった?
Azureポータルで確認
Azureポータルであれば、イメージ テンプレートの詳細画面からビルドの実行状態が確認できました。
詳細画面
拡大
コマンドで確認する場合
azコマンドでビルド状況を確認できます。
az image builder show --name $imageTemplateName --resource-group $imageResourceGroup
まだビルド途中のようです。
そして結末へ
さらに待つこと数十分…。
イメージテンプレートの詳細画面
失敗しとるやろがい。
Faild内容
Operation timed out. This happens because the build and image distribution have exceeded the `buildTimeoutInMinutes`. Please review the build customization.log, and examine for long running operations. If expected, consider increasing the `buildTimeoutInMinutes` property in the Image Builder Template. For more information on troubleshooting, go to https://aka.ms/azvmimagebuilderts.
Deepl訳
操作がタイムアウトしました。これは、ビルドとイメージの配布が `buildTimeoutInMinutes` を超えたために起こります。ビルドのcustomization.logを確認し、長時間実行されている操作がないか調べてください。予想される場合は、イメージビルダーテンプレートの`buildTimeoutInMinutes`プロパティを増やすことを検討してください。トラブルシューティングの詳細については、https://aka.ms/azvmimagebuilderts を参照してください。
同様の内容が
az image builder show --name $imageTemplateName --resource-group $imageResourceGroup
でも確認できました。
おわりに
今回は長すぎるのを待っててもダメでした。「長いな」と思ったときに何かをするべきだったなと反省。 さてもう一度トライするか…。
Outlook.comでもプラス記号でメールアドレスが増やせた
はじめに(そして結論)
Gmailでメールアドレスの@前に+記号と任意の文字列を足しても、元のメールアドレスにメールを配信してくれる…という振り分け処理に便利な割と有名な豆知識があります。
最近Exchange OnlineでPlus Addressingという名前でサポートしたというドキュメントを見て、「これってもしかして無料のOutlook.comアカウントでも対応してる?」のではと思い、試してみたら「対応していた」という記事です。
発見したもの
デフォルト無効らしいですがExchange Onlineでプラス記号付加で新しいアドレスを作成できるとのこと。
"Plus Addressing"という用語は初めて聞きましたが、どうもGmailのと同じようなもののようです。
検証
無料メールであるOutlook.comではどうなんだ…ということでまずは確認してみます。
受信側:受信前の状態
送信側:テスト送信
宛先に+記号を追加したもので送信します。 たとえば
{ユーザー名}@outlook.com
であれば
{ユーザー名}+test100@outlook.com {ユーザー名}+notify@outlook.com {ユーザー名}+help@outlook.com
など任意の文字列でOK.
受信側:受信結果
プラス記号付きのメールアドレスでも正常に受信が確認できました。
受信側:受信確認
内容も問題なし。
まとめ
プラス記号付きのメールアドレスでもGmailと同じようにOutlook.comで受信できました。
これによりメールアドレスをIDとするようなサービスで複数のメールアドレスとして利用できたり、メールフィルタの振り分けルールに利用できそうです。
(私の調べた限りまだOutlook.comでの公式ドキュメントは確認できてないです)
Azure Key-Vault(キー コンテナー)の論理的な削除と確認
Azure Key-Vault(キーコンテナー)は削除しても論理削除として一定期間保護される機能がある
AzureでKey-Vaultの削除・作成を繰り返していたら、作成時に「既に使用されているか、以前に論理的に削除された コンテナー によってまだ確保されています。別の名前を使用してください。」と警告が出たのでメモ。
Key-Vault(キーコンテナー)の作成時に以下の項目があって、 削除しても一定期間リカバリーできるように保護される設定がある。
詳しくは
Azure Key Vault の論理的な削除 | Microsoft Docs
論理削除されている場合、利用することはできないがリカバリしてまた利用することができるし、論理削除中は同名のKey-Vault(キーコンテナー)を作成することができない。 実際にリカバリ(回復)を行いたい場合、どうするのかというとどうもAzureのポータルからは操作ができないっぽい。(2020年07月時点)
azコマンドで操作が可能。
現在のKey-Vaultの一覧
> az keyvault list
論理削除中のKey-Vaultの一覧
> az keyvault list-deleted
復元する方法
location(東日本ならjapaneast)、resource-group(リソースグループ名)、name(回復するKey-Vaultの名前)を指定し以下のコマンド
az keyvault recover --location japaneast --resource-group ContosoRG --name ContosoVault
"az keyvault recover"が成功すれば、Key-Vaultが復活している。 見たところ登録した証明書の情報も合わせて復元されていた。
Azure CLIをPowerShellでインストールする
PowerShellを管理者権限で起動し
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; rm .\AzureCLI.msi
その後、PowerShellのプロンプトを再起動する。