beatF5run

技術系の話とか、勉強会とか

WhisperをWSL2で動かそうとしたらCUDA errorが出た際の対処作業メモ

元ネタ

github.com

はじめに

OpenAIが発表した音声認識モデルをGPU付きのローカルのWSL2で動かそうとしてCUDA errorが出た対処の作業メモです。

手軽にWhisperを動かしたいだけならGoogle Colabで動くので

qiita.com

上記のブログ等を参考に手を動かしてみると早いです。ほんとWhisperすごい。

本ページではローカルのWSL2で動かしたときに遭遇したエラーへの対処を書きます。

環境

環境作成

今回はvenvを利用して環境を作りました。

$ mkdir whisper_run
$ cd whisper_run
$ python3 -m venv whisper_test
$ source ./whisper_test/bin/activate

ドライバ、CUDA Toolkitのアップデート

公式からたどって最新にしておきました。

learn.microsoft.com

Whisperのインストール

公式

GitHub - openai/whisper

こちらも公式にしたがいます。

$ pip install git+https://github.com/openai/whisper.git 
$ sudo apt update && sudo apt install ffmpeg

音声ファイルの準備

今回テスト用に『青空朗読』から音声ファイルをお借りしました。

※音声ファイルはダウンロードできますが、フリー音源ではないのでご注意ください

aozoraroudoku.jp

テストコード

これも公式から。

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

pytorch.org

を参考に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 開発環境」を選択し、「仮想マシンの作成」ボタンを押下。

仮想マシンの起動

Hyper-Vマネージャー

対象の仮想マシンを起動。

PowerShellの起動

仮想マシンにログイン後、PowerShellを「管理者モード」で起動。

PowerShell起動

wslコマンドで起動可能なディストリビューションの確認

wsl --list --online

上記コマンドでWSL2で利用可能なディストリビューションを確認。

実行結果

wsl --list --online結果

wslコマンドによる起動:失敗時

wsl --install -d Ubuntu

上記のwslコマンドでUbuntuの起動を試みますが、この時点では仮想化を有効にしていないのでUbuntuのウインドウが起動されるものの、前述の「仮想化機能を有効にしてください」という旨のメッセージが表示され、Ubuntuは利用できません。

起動しないケース

wsl --install -d Ubuntu 起動失敗

手順2:仮想化有効化まで

この作業はホスト側の作業です。

仮想マシンの名称確認

仮想マシンの名称を確認します。 Hyper-Vマネージャーに表示される名称で問題ないのですが、今回はPowerShellで同じ名称になるかを確認しました。

参考

docs.microsoft.com

管理者モードでPowerShellを起動し、以下のコマンドを実行。

Get-VM

Get-VM結果

ここでは「Windows 11 開発環境_1」を対象に作業を進めます。(作業の都合、名称を変更しています)

仮想化機能を有効にする

Hyper-V on Hyper-V」の入れ子を可能にするにはPowerShell上で「Set-VMProcessor」コマンドを利用して仮想マシンごとに仮想化を有効にします。

参考URL:入れ子になった仮想化による仮想マシンでの Hyper-V の実行

docs.microsoft.com

Set-VMProcessor -VMName "Windows 11 開発環境_1" -ExposeVirtualizationExtensions $true

Set-VMProcessorコマンドの結果

Set-VMProcessor結果

手順3:仮想化有効後

ここの作業は仮想マシン上で行います。

仮想マシンPowerShellを起動

仮想マシンへログインし、「管理者モード」でPowerShellを起動

wslコマンドによる起動:成功

手順1と同じようにwslコマンドでの起動を試みる。

wsl --install -d Ubuntu

Ubuntuの別ウインドウが起動し、Ubuntuへのログインが確認できました。

※この時点で気づいたんですが、"wsl --install -d Ubuntu"を実行時にUbuntuディストリビューションはインストール済であるとメッセージにでてますね。

Ubuntu起動成功

wsl --install -d Ubuntu 起動成功

手順は以上となります。

まとめ(と追記)

  • Windows 11ではHyper-Vで「評価版 Windows 11」が利用できる
  • Hyper-V上の「評価版 Windows 11」でWSL2が利用できるが「仮想化有効」のためのコマンドを叩く必要あり

~追記~

  • 「評価版 Windows 11」にはすでにWSL2のUbuntuがインストール済みなので、すぐ使えて楽
  • 仮想マシン上でのwslコマンドでUbuntuをインストールするにはPowerShellは一般ユーザーでもできた

おわりに

WSL2自体のインストールはかなり簡略化されましたが、WSL2自体をお試しであれこれする環境が欲しかったので、これで環境の汚染や破壊を恐れずに作業できそうです。

Windows Sandbox(サンドボックス)ではそもそもWSL2使えませんよね?

Azure Image Builderでイメージビルド中にターミナルを閉じてしまったら

はじめに

Azure Image Builderでイメージビルド中にターミナルを閉じてしまい、ビルドの結果を見失ったのでその対応について書きます。

Azure Image Builderでイメージを作成する

docs.microsoft.com

上記サイトを参考にVMイメージのビルドをしてみました。

ただし、上記サイトの日本語ページには誤記があるので下記のサイトを参考に一か所修正してビルドを実施する必要があります。

atmarkit.itmedia.co.jp

チュートリアルを開始するのに便利な機能

チュートリアルには実行するコマンドが記載されていますが、コマンドの右上にある「使ってみる」を押すと右ペインに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

Building

まだビルド途中のようです。

そして結末へ

さらに待つこと数十分…。

イメージテンプレートの詳細画面

結末

失敗しとるやろがい。

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アカウントでも対応してる?」のではと思い、試してみたら「対応していた」という記事です。

発見したもの

docs.microsoft.com

デフォルト無効らしいですがExchange Onlineでプラス記号付加で新しいアドレスを作成できるとのこと。

"Plus Addressing"という用語は初めて聞きましたが、どうもGmailのと同じようなもののようです。

検証

無料メールであるOutlook.comではどうなんだ…ということでまずは確認してみます。

受信側:受信前の状態

f:id:yiw:20210601223244p:plain
受信前

送信側:テスト送信

f:id:yiw:20210601223947p:plain
テスト送信

宛先に+記号を追加したもので送信します。 たとえば

{ユーザー名}@outlook.com

であれば

{ユーザー名}+test100@outlook.com
{ユーザー名}+notify@outlook.com
{ユーザー名}+help@outlook.com

など任意の文字列でOK.

受信側:受信結果

プラス記号付きのメールアドレスでも正常に受信が確認できました。

f:id:yiw:20210601233325p:plain
受信結果

受信側:受信確認

内容も問題なし。

f:id:yiw:20210601224915p:plain
受信確認

まとめ

プラス記号付きのメールアドレスでもGmailと同じようにOutlook.comで受信できました。

これによりメールアドレスをIDとするようなサービスで複数のメールアドレスとして利用できたり、メールフィルタの振り分けルールに利用できそうです。

(私の調べた限りまだOutlook.comでの公式ドキュメントは確認できてないです)

Azure Key-Vault(キー コンテナー)の論理的な削除と確認

Azure Key-Vault(キーコンテナー)は削除しても論理削除として一定期間保護される機能がある

AzureでKey-Vaultの削除・作成を繰り返していたら、作成時に「既に使用されているか、以前に論理的に削除された コンテナー によってまだ確保されています。別の名前を使用してください。」と警告が出たのでメモ。

Key-Vault(キーコンテナー)の作成時に以下の項目があって、 削除しても一定期間リカバリーできるように保護される設定がある。

f:id:yiw:20200726203922p:plain
論理的な削除の動作

詳しくは

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のプロンプトを再起動する。

元ネタ:

docs.microsoft.com

一周年『札幌 Azure もくもく会』

もくもく?

ご縁があって「もくもく会」という勉強会のお手伝いをさせてもらっています。

マイクロソフト社が提供しているAzureというクラウドサービスをテーマにした勉強会で『札幌 Azure もくもく会』というんですが。

sapporoazuremok2.connpass.com

続きを読む