

### 前提

awsのsagemakerにて音響モデルを用いたTTSシステムを作っています。

### 実現したいこと

sagemakerで音響モデルをデプロイしたいと考えています。

### 発生している問題・エラーメッセージ

デプロイ時に下記のエラーが繰り返し発生します。

[code]

    Please specify --force/-f option to overwrite the model archive output file.
    See -h/--help for more details./.sagemaker/mms/models/model
    ERROR - %s already exists.
    
[/code]

### 以下、デプロイ用コード

[code]

    from sagemaker import get_execution_role
    from sagemaker.pytorch.model import PyTorchModel
    
    role = get_execution_role()
    
    pytorch_model = PyTorchModel(model_data='s3://sagemaker-alterly/model.tar.gz', 
                                 role=role,
                                 framework_version="1.3.1",
                                 py_version="py3",
                                 entry_point='inference.py')
    
    predictor = pytorch_model.deploy(instance_type='ml.t2.2xlarge', initial_instance_count=1)
    
[/code]

※entry_pointの推論コード：iference.py

[code]

    import os
    import time
    import torch
    import pyopenjtalk
    from espnet2.bin.tts_inference import Text2Speech
    import matplotlib.pyplot as plt
    from espnet2.tasks.tts import TTSTask
    from espnet2.text.token_id_converter import TokenIDConverter
    import numpy as np
    
    import argparse
    import text_processing as texp
    import os
    
    import boto3
    
    prosodic = True
    
    model_dir = "model/"
    vocoder_dir = "vocoder/"
    CONTENT_TYPE = "text/plain"
    
    train_config = "model/config.yaml"
    model_file = "model/50epoch.pth"
    # train_config=""
    # model_file="
    
    vocoder_tag = "parallel_wavegan/jsut_hifigan.v1"
    # ボコーダを指定
    vocoder_config = "vocoder/config.yaml"
    vocoder_file = "vocoder/50epoch.pth"
    
    
    def model_fn(model_dir):
        print(model_dir + "config.yaml")
        print(model_dir + "100epoch.pth")
        model = Text2Speech.from_pretrained(
            train_config=model_dir + "config.yaml",
            model_file=model_dir + "100epoch.pth",
            vocoder_tag=vocoder_tag,
            device="cpu",
            speed_control_alpha=1.0,
            noise_scale=0.333,
            noise_scale_dur=0.333,
        )
    
        return model
    
    
    def input_fn(request_body, content_type=CONTENT_TYPE):
        input_data = "あいうえお"
        return input_data
    
    
    def predict_fn(input_data, model):
        import torch
        import os
        import numpy as np
    
        x = "デモテキスト"
    
        # model, train_args = TTSTask.build_model_from_file(
        #         train_config,  model_file, "cuda"
        #        )
    
        token_id_converter = TokenIDConverter(
            token_list=model.train_args.token_list,
            unk_symbol="<unk>",
        )
    
        text = x
        if prosodic:
            tokens = texp.a2p(x)
            text_ints = token_id_converter.tokens2ids(tokens)
            text = np.array(text_ints)
        else:
            print("\npyopenjtalk_accent_with_pauseによる解析結果：")
            print(texp.text2yomi(x), "\n")
    
        # synthesis
        with torch.no_grad():
            start = time.time()
            data = model(text)
            wav = data["wav"]
            # print(text2speech.preprocess_fn("<dummy>",dict(text=x))["text"])
        rtf = (time.time() - start) / (len(wav) / model.fs)
        print(f"RTF = {rtf:5f}")
    
        if not os.path.isdir("generated_wav"):
            os.makedirs("generated_wav")
    
        # let us listen to generated samples
        from IPython.display import display, Audio
        import numpy as np
        #display(Audio(wav.view(-1).cpu().numpy(), rate=text2speech.fs))
        #Audio(wav.view(-1).cpu().numpy(), rate=text2speech.fs)
        np_wav = wav.view(-1).cpu().numpy()
    
        fs = 48000
        print("サンプリングレート", fs, "で出力します。")
        from scipy.io.wavfile import write
        samplerate = fs
        t = np.linspace(0., 1., samplerate)
        amplitude = np.iinfo(np.int16).max
        data = amplitude * np_wav/np.max(np.abs(np_wav))
        write("espnet/egs2/jsut/tts1/generated_wav/"+x +
              ".wav", samplerate, data.astype(np.int16))
        print("\n\n\n")
    
        # バケットへの接続
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('alterly-source')
        bucket.upload_file("espnet/egs2/jsut/tts1/generated_wav/" +
                           x + ".wav", "source/"+x+".wav")
    
        x = "exit"
    
    
    input_object = input_fn("あいうえお", "text/plain")
    model = model_fn(model_dir)
    prediction = predict_fn(input_object, model)
    
[/code]

以下のコマンドで実行

[code]

    !inference.py
    
[/code]

### 補足情報

圧縮前のディレクトリ構造は下記です。

[![画像の説明をここに入力](https://i.stack.imgur.com/5jQAW.png)](https://i.stack.imgur.com/5jQAW.png)

こちらをmodel.tar.gzに圧縮してs3に設置しています。

急ぎの案件のため、他サイトでも相談させてもらっています。  
進捗があった際にはこちらにも共有いたします。  
<https://teratail.com/questions/j8ux53rs8n7v2t>

対処方法をご存知の方がいましたら、ご教授いただけますと幸いです。


CC BY-SA 4.0
2022-09-17T08:57:32.527
91142
2022-09-20T05:22:52.203
2022-09-20T01:57:48.850
53797
53797
question
python python3 aws 機械学習
sagemaker環境にてデプロイに失敗する


自己解決しました。  
下記のコードの `flamework_version` と `py_version` で指定する値をそれぞれ修正したところ改善しました。

誤：

[code]

    pytorch_model = PyTorchModel(model_data='s3://sagemaker-alterly/model.tar.gz',
    role=role,
    framework_version="1.3.1",
    py_version="py3",
    entry_point='inference.py')
    
[/code]

正：

[code]

    pytorch_model = PyTorchModel(model_data='s3://sagemaker-alterly/model.tar.gz',
    role=role,
    framework_version="1.12",
    py_version="py38",
    entry_point='inference.py')
    
[/code]

コメント等いただいた方、お手数おかけして失礼しました。  
誠にありがとうございました。


CC BY-SA 4.0
2022-09-20T03:15:13.343
91188
2022-09-20T05:22:52.203
2022-09-20T05:22:52.203
3060
53797
91142
answer