[4週間]AWS-2021228


以前、クラウドサービスマイクロソフトAzureを利用したことがあります.
プログラマーのデブコスでAWSについて議論し始めました
AWSはインスタンスを作成した後、セキュリティキーファイルを使用してssh接続を行う必要があります.
ssh接続は普段よく使われているmobaXtermを使用しています.
mobaXtermを使用する前に、権限設定が話題になりました.
Googleのどのソリューションも解決できません.
新しいインスタンスを作成し、最初に作成したセキュリティキーファイルを使用します.
mobaXtermを使用すると、権限を設定することなくアクセスできます.(ウィンドウPowerShellからアクセスできないまま)
Prettyerアカウントで作成された基本インスタンス.
深い学習に必要な基本モジュールがインストールされています.
conda env list

ただし、このメソッドを使用すると、リモートインスタンスに直接接続できます.
vs codeなどのIDEによるリモート開発環境には適用できないため,より多くの方法を理解した.
wslをインストールしてwindowsにlinuxサブシステムをインストールすることで解決します.
しかしwslでchmodコマンドを変更する権限はあまり応用されていない.
コマンドにエラーは発生しませんが、コマンドの変更は適用されません.
これについて調査を行った.
https://github.com/microsoft/WSL/issues/81
このリンクでは、mntサブシステムは権限の変更を受け入れません.
そのため、キーファイルをメインサブシステムに移動し、権限変更を適用して適用し、接続に成功しました.
変更したファイルをmntサブアイテムに移動すると、次のように変更は消えます.そのまま家庭の底辺で使う.

vscodeのリモートssh開発環境に適用するには、
pemファイルのパスを
\\wsl$\Ubuntu-20.04\home\mizztick
使用
ここまでは実行ミスが多かったのですが、他の解決策で提案した解除権限継承が解決していない本人は、この方法で解決しました.

api serving


サービス向けモデルapiでは、次の大きなフレームワークを考慮する必要があります.
△必須ではないが、メンテナンスなどの面から習慣をつけなければならない.
class ModelHandler(BaseHandelr):
	def __init__(self):
    	
    	def initialize(self, **kwargs):
        # 데이터 처리나 모델, configuration 등 초기화
        # 1. Configuration 등 초기화
        # 2. (Optional) 신경망을 구성하고 초기화
        # 3. 사전 학습한 모델이나 전처리기 불러오기
        
            pass
            
        def preprocess(self, data):
        # Raw input을 전처리 및 모델 입력 가능 형태로 변환
        # 1. Raw input 전처리
        # 데이터 클린징의 목적과 학습된 모델의 학습 당시 Scaling이나 처리 방식과 맞춰주는 것이 필요
        # 2. 모델에 입력 가능한 형태로 변환
        # vectorization, converting to id 등의 작업
        
            pass
        
        def inference(self, data):
        # 입력된 값에 대한 예측 / 추론
        # 1. 각 모델의 predict 방식으로 예측 확률 분포 값 반환
        
            pass
            
        def postporecess(self, model_output):
        # 모델의 예측값을 response에 맞게 후처리 작업
        # 1. 예측된 결과에 대한 후처리 작업
        # 2. 보통 모델이 반환하는 것은 확률분포와 같은 값이기 때문에 response에서 받아야하는 정보로 처리하는 역할
        
            pass
            
        def handle(self, data):
        # 요청 정보를 받아 적절한 정보를 반환
        # 1. 정의된 양식으로 데이터가 입력됐는지 확인
        # 2. 입력 값에 대한 전처리 및 모델에 입력하기 위한 형태로 변환
        # 3. 모델 추론
        # 4. 모델 반환값의 후처리 작업
        # 5. 결과 반환
        
            pass
            

API定義


Flashベースの感性解析apiの例を実行します.
key:value形式のjson形式でrequestを受信し、text indexでkey:valueで結果を保存したjson形式で結果を返します.
# [POST] /predict
json = {
	"text": [review1", "review2", ..., ],
    "do_fast": true or false
}
# response
{ "idx0" : {
	"text": "review1",
	"label": "positive" or "negative",
	"confidence": float
	},
"idxn" : {...},
...,
}
モデルハンドルの各セクションには、次のものがあります.

初期化

def initialize(self, ):
        from transformers import AutoTokenizer, AutoModelForSequenceClassification
        self.model_name_or_path = 'sackoh/bert-base-multilingual-cased-nsmc'
        self.tokenizer = AutoTokenizer.from_pretrained(self.model_name_or_path)
        self.model = AutoModelForSequenceClassification.from_pretrained(self.model_name_or_path)
        self.model.to('cpu')

前処理

def preprocess(self, text):
        model_input = self._clean_text(text)
        model_input = self.tokenizer(text, return_tensors='pt', padding=True)
        return model_input

推論する

    def inference(self, model_input):
        with torch.no_grad():
            model_output = self.model(**model_input)[0].cpu()
            model_output = 1.0 / (1.0 + torch.exp(-model_output))
            model_output = model_output.numpy().astype('float')
        return model_output

ポストプロセッシング

    def postprocess(self, model_output):
        predicted_probabilities = model_output.max(axis=1)
        predicted_ids = model_output.argmax(axis=1)
        predicted_labels = [self.id2label[id_] for id_ in predicted_ids]
        return predcited_labels, predicted_probabilities

そうじゅう

def handle(self, data):
        model_input = self.preprocess(data)
        model_output = self.inference(model_input)
        return self.postprocess(model_output)

課題


フラスコに基づくpost要求の推論モデルを例示コードにより実行した.
postまたはgetで学習を要求し、学習を実行する時間を返してみましょう.
まず、ユーザーに実行時間を簡単に返させ、デフォルトの戻りタイプはバイトタイプ(管理が必要な場合はフォーマットを変更)
import requests

url = "http://host:port//train"

response = requests.post(url)
print(response)
print(response.content)
print(response.content.decode('utf-8'))

学習データをダウンロードし、学習/評価/モデルを保存してから経過時間を返します。

# train_ml.py

def download_data(mode):
    base_url = f'https://raw.githubusercontent.com/e9t/nsmc/master/ratings_{mode}.txt'
    r = requests.get(base_url)
    with open(f'ratings_{mode}.txt', 'wb') as w:
        w.write(r.content)
    logger.info("Downloaded from {}".format(base_url))


def train_and_evaluate():
    train = pd.read_csv('ratings_train.txt', sep='\t').drop('id', axis=1).fillna('')
    test = pd.read_csv('ratings_test.txt', sep='\t').drop('id', axis=1).fillna('')
    X_train, y_train = train['document'].apply(clean_text), train['label']
    X_test, y_test = test['document'].apply(clean_text), test['label']

    vectorizer = CountVectorizer(max_features=100000)
    vectorizer.fit(X_train)
    logger.info("fitting Counter vectorizer")

    X_train = vectorizer.transform(X_train)
    X_test = vectorizer.transform(X_test)
    logger.info("Transform raw text into vector")

    model = MultinomialNB()
    model.fit(X_train, y_train)
    logger.info("Trained Naive Bayes model.")
    evaluation_score = model.score(X_test, y_test)
    logger.info(f"ML model accuracy score: {evaluation_score*100:.2f}%")

    return model, vectorizer


def serialization(model, vectorizer):
    import joblib
    os.makedirs('model', exist_ok=True)
    joblib.dump(vectorizer, 'model/ml_vectorizer.pkl')
    logger.info(f'Saved vectorizer to `model/ml_vectorizer.pkl`')
    joblib.dump(model, 'model/ml_model.pkl')
    logger.info(f'Saved model to `model/ml_model.pkl`')
    
    

ラーニングリクエスト

@app.route("/train", methods=["POST"])
def train():
    start_time = datetime.now()
    # Download train and test data from github
    for mode in ['train', 'test']:
        train_ml.download_data(mode)

    # train and evaluate model
    model, vectorizer = train_ml.train_and_evaluate()

    # Serialization
    train_ml.serialization(model, vectorizer)
    return f'Elapsed Time, {datetime.now() - start_time}'

結果


学習後経過時間を請求する