🙆

MacのRVC-WebUIでdoesn't support float64

2023/04/27に公開

2023年4月27日現在 MacのRVC-WebUI(Retrieval-based-Voice-Conversion-WebUI)で音声を変換する推論で以下ようなErrorが出る。

Error内容

my_sample.wav->Traceback (most recent call last):
File "/Users/xxx/dev/vrc/Retrieval-based-Voice-Conversion-WebUI/infer-web.py", line 153, in vc_single
audio_opt = vc.pipeline(
File "/Users/xxx/dev/vrc/Retrieval-based-Voice-Conversion-WebUI/vc_infer_pipeline.py", line 242, in pipeline
pitchf = torch.tensor(pitchf, device=self.device).unsqueeze(0).float()
TypeError: Cannot convert a MPS Tensor to float64 dtype as the MPS framework doesn't support float64. Please use float32 instead.

このエラーは、MPS(Metal Performance Shaders)フレームワークがfloat64のデータ型をサポートしていないため、float64を使用できないことが原因。

暫定対応

とりあえずの対応としてはMPSを使わずにCPUにして回避する。
config.pyで設定を修正する。

config.py
def has_mps() -> bool:
    if sys.platform != "darwin":
        return False
    else:
        if not getattr(torch, "has_mps", False):
            return False
        try:
            torch.zeros(1).to(torch.device("mps"))
            #return True   #削除
            return False  #追加 MPSなしとしてCPUが使われる。
        except Exception:
            return False

追記 2023/06/05
再度インストールしたが修正が入っていて上の部分がなかったので下を消して無理やりCPUとした

config.py
	#elif torch.backends.mps.is_available():
        #    print("没有发现支持的N卡, 使用MPS进行推理")
        #    self.device = "mps"
        #    self.is_half = False
        #    config_file_change_fp32()

※ 推論(infer)側のみ直ることを確認しました。訓練(train)側は試していません(train側はどうなんでしょうね)。

根本対応

Support for Apple's MPS [?] #136で対応中のようです。
https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/issues/136

その他(試したが直らなかった)

推論側の上記エラーが出る部分でエラーの従って入力をfloat64をfloat32に変更してみた。

すなわち、
pitchf = torch.from_numpy(pitchf.astype(np.float32)).clone()
とか
pitchf = np.array(pitchf, dtype='f4')
のようにfloat64からfloat32に変換しても、

loc("varianceEps"("(mpsFileLoc): /AppleInternal/Library/BuildRoots/20d6c351-ee94-11ec-bcaf-7247572f23b4/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm":219:0)): error: input types 'tensor<1x382x1xf16>' and 'tensor<1xf32>' are not broadcast compatible
LLVM ERROR: Failed to infer result type(s).
zsh: abort python3 infer-web.py

のエラーが出て直らなかった。
hubert_modelの読み込みなど色々、型を合わせる必要がある気がします。

Discussion