ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

「クチコミ分析システムの作り方 実践・自然言語処理シリーズ」を読んでる

memo

Seleniumを使って、dl > dt, ddのフォーマットでddが複数あるときのスクレイピング

こういうやつ

<dl>
    <dt></dt>
    <dd></dd>
    <dd></dd>
    <dt></dt>
    <dd></dd>
</dl>

dtとddで1対1かしらとか思ってたけど、そうじゃなかったねめんどくさい。

というわけでゴリ押してみた

def add_values(values, _values):
    if len(_values) > 0:
        values.append(_values)


def get_data(driver):
    ds = driver.find_elements_by_css_selector('dl > *')
    keys = []
    values = []
    _values = []
    n = len(ds)
    i = 0
    while n > i:
        d = ds[i]
        if d.tag_name == 'dt':
            keys.append(d.text)
            add_values(values, _values)
            _values = []
            i += 1
            continue

        if d.tag_name == 'dd':
            _values.append(d.text)
            i += 1
            continue

    add_values(values, _values) 
    return dict(zip(keys, values))

途中でddがきたら、dtが来るまでため続けて、dtがきたらddをvaluesのlistに追加してクリアするを繰り返す。

jqueryみたいにnextとか使えたら。。。って思うけどまぁいいや(多分これで大丈夫なはず)。さっと作ったので多分ボロいはず

SageMakerで遊ぶメモ#2

trainしてs3にアップされたモデルをデプロイするコード

from boto3.session import Session


class SagemakerClient:

    def __init__(self):
        self.client = Session().client("sagemaker", region_name="us-west-2")

    def create_model(self, model_data_url):

        model_params = {
            "ExecutionRoleArn": "hogehoge-fugafuga:role/aipa-sagemaker-train", 
            "ModelName": "sample-model", # モデル名
            "PrimaryContainer": {
                "Image": "hogehoge-fugafuga.com/aipa-sagemaker-test", # ECRにプッシュしたイメージURL
                "ModelDataUrl": model_data_url # モデルデータが格納されているS3のパス
            }
        }

        self.client.create_model(**model_params)


if __name__ == '__main__':
    model_data_url = 's3://aipa-hogehoge-fugafuga-train/output-data/sample-training2/output/model.tar.gz'
    SagemakerClient().create_model(model_data_url)

ここから推論ってどうするんや・・・・?って気になったので調べてたら下記が参考になった(考え方ね)

qiita.com

そもそも、チュートリアルにあるnginx.confとかwsgi.pyってなんで???なしてFlask使っているの???って思ってたけど、エンドポイントでの通信はHTTPで行われるので、登録するDocker imageではFlaskやnginx等の設定が必要とのこと。webのミドルウェアwsgiを使えない人には厳しそう。。。コピペするだけで良いとは思うけど

dev.classmethod.jp

SageMakerで遊ぶメモ#1

qiita.com

↑の記事を参考にして進めた。

諸事情でIAMユーザー発行&アクセスキー等発行できないので、EC2インスタンス上で行った。リージョンはオレゴン

IAM

  • roleを作成 aipa-hogehoge-fugafuga-train
  • policy
    • AmazonEC2ContainerRegistryFullAccess
    • AmazonS3FullAccess
    • AmazonSageMakerFullAccess
  • 信頼されたエンティティ
    • ec2.amazonaws.com
    • sagemaker.amazonaws.com

S3

  • s3://aipa-hogehoge-fugafuga-train で作成

手順

$ sudo apt update -y
$ sudo apt install awscli
$ aws ecr create-repository --repository-name aipa-hogehoge-fugafuga-test --region us-west-2

# チュートリアル
$ git clone https://github.com/aws/amazon-sagemaker-examples.git
$ cd amazon-sagemaker-examples/advanced_functionality/scikit_bring_your_own/container/
$ aws s3 cp local_test/test_dir/input/data/training/iris.csv s3://aipa-sagemaker-train/input-data/
$ aws s3 cp .gitkeep s3://aipa-sagemaker-train/output-data/
$ touch .gitkeep
$ bash build_and_push.sh aipa-hogehoge-fugafuga-test
$ python sagemaker_client.py

sagemaker_client.py

from boto3.session import Session


class SagemakerClient:

    def __init__(self):
        self.client = Session().client("sagemaker", region_name="us-west-2")

    def submit_training_job(self):
        training_params = {
            "TrainingJobName": "sample-training", # トレーニングのジョブ名(同じ名前は駄目)
            "HyperParameters": {  # 学習時のパラメータ
            'objective': 'multiclass',
            'num_class': '3'
        },
        "AlgorithmSpecification": {
            'TrainingImage': "hogehoge.aws.com/aipa-hogehoge-fugafuga-test:latest", # トレーニング時に使用するDocker イメージ
            'TrainingInputMode': 'File'
        },
        "RoleArn": "arn:aws:iam::129119569090:role/aipa-hogehoge-fugafuga-train", # SageMakerにアタッチするロール
        "InputDataConfig": [
            {
                'ChannelName': 'training',
                'DataSource': {
                    'S3DataSource': {
                        'S3DataType': 'S3Prefix',  # s3上のファイルを使う場合はこちらを指定する
                        'S3Uri': "s3://aipa-hogehoge-fugafuga-train/input-data/iris.csv" # トレーニング時に使用するデータを入れたS3のパス
                    }
                }
            }
        ],
        "OutputDataConfig": {
            'S3OutputPath': "s3://aipa-hogehoge-fugafuga-train/output-data/"  # トレーニングした後にモデルを出力するためのS3のパス
        },
        "ResourceConfig": {
            'InstanceType': 'ml.m4.xlarge',  # インスタンスタイプ
            'InstanceCount': 1,  # 学習インスタンス台数
            'VolumeSizeInGB': 10  # 学習インスタンスのボリューム
        },
        "StoppingCondition": {
            'MaxRuntimeInSeconds': 60 * 60
        }
        }

        response = self.client.create_training_job(**training_params)
        print(response)

if __name__ == '__main__':
    SagemakerClient().submit_training_job()

雑感

  • 慣れたら多分すごい便利(環境構築とか何もいらん&Dockerでやるから確認は必要なんだけども) 
  • デバッグがめんどそう