Azure Machine Learningで「徐々に」管理対象を増やす


# データセット

前回までは、ローカルリポジトリのデータを丸ごとワークスペースにアップロードして、それをロードしていましたが、これをsubmitごとにやるのは（いくつか利点はなくもないですが）無駄です。

## before : submitごとにアップロード

以下のようにソースディレクトリにdataファイルを入れて置き、丸ごとアップロードな感じでした。

``` amlrun.py
runconfig = ScriptRunConfig(source_directory=project_folder, script="xxx.py")
...
script_params = {
    '--datafile': 'xxxx.csv', ...
}
estimator = SKLearn(source_directory=project_folder, 
                script_params=script_params,
                entry_script='estimator.py', ...
)
```

``` estimator.py
parser.add_argument('--datafile', type=str, default='',
                     help='Data file for train/predict')
...
df = pd.read_csv(datapath + datafile)
```

## Datastoreへの登録

AMLSのサンプルコードの多くはパブリックデータセットをAMLSのデフォルトリポジトリから抽出して利用するので、あまりこの辺が判然としませんでした。いくつか解説記事を読んでわかりました。

セットアップコードは以下でrunnerと同じ。

``` register_data.py
# おまじない　デフォルトのdatastoreを得る
from azureml.core import Workspace, Dataset, Datastore
from azureml.data.dataset_factory import DataType,FileDatasetFactory
ws = Workspace.from_config()
datastore = Datastore.get(ws, 'workspaceblobstore')
```

## datastoreへのアップロード
さしあたり、手元のデータをデータストアにアップロードします。

``` register_data.py
datastore.upload_files(files=['./data/data1.csv'], target_path='data/')
```

または、以下のようにディレクトリごとアップロードも可能です。

``` register_data.py
datastore.upload(src_dir='data', target_path='data')
```

## DataSetとして登録

実際にデータセットとしてＭＬパイプラインに投入するにはDatasetとして登録する必要があります。
以下の二つのDatasetがあります。

* Tabuler
* File

TabularはCSVなどの表データ、Fileは画像など表にならない非構造化、半構造化データなどを入れるものです。それぞれ以下のような作り方になります。

``` register_data.py
tab_dataset = Dataset.Tabular.from_delimited_files(path=(datastore,'data/data1.csv'))
file_dataset = Dataset.File.from_files(path=(datastore,'data/data1.csv'))
```

以下のようにすると、ALM Studioからも見える、Registered datasetになります。

``` register_data.py
tab_dataset = tab_dataset.register(workspace=ws, name='tab_ds1', description='dataset 1 in tabular format', tags={'format':'CSV'}, create_new_version=True)
file_dataset = file_dataset.register(workspace=ws, name='file_ds1', description='dataset 1 in Files format', tags={'format':'CSV'}, create_new_version=True)
```

ひとたびRegistered datasetになればStudio UIからのアクセスが可能になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/c03bf11f-3178-2443-24d8-8b964836eb09.png" width="70%">


一方StudioのUIから直接登録したデータセットはというと、以下のように"UI/時刻'というフォルダが生成されており、そのパスでのアクセスとなっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/2c04ca39-efc2-0e86-1ad0-fccd9d6598f5.png" width="50%">

## datasetの利用

普通に引数として渡していた場合は以下のようにファイルを抽出すればOKです。

``` estimator.py
workspace = run.experiment.workspace
dataset = Dataset.get_by_name(workspace=workspace, name=datafile)
df = dataset.to_pandas_dataframe()
```

この場合でも、入力データセットしてこのDatasetが利用された事が実験に記録されるようになります。入力名はなしですが。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/6407497d-a9e5-9322-b1f6-7d7076e454b6.png" width="50%">

正規の方法で入力データセットをトラックするには以下のように行います。SKLearnなどrunconfigの設定にinputs(など）パラメータでdatasetを登録します。.as_named_input が実際のデータセット名ではなく、この実験の引数名として引き渡されます。

``` amlrun.py

dataset = Dataset.get_by_name(workspace=ws, name="registered_dataset")
estimator = SKLearn(source_directory=project_folder, 
                script_params=script_params,
                inputs=[dataset.as_named_input('input_ds')],
                entry_script='estimator.py', ...
)
```

``` estimator.py
df = run.input_datasets['input_ds'].to_pandas_dataframe()
```

これで以下のように入力名が実験に記録されるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/c39dc705-3be1-25ba-531c-9ef02ea74245.png" width="50%">


# モデル

モデルを専用の場所に登録することで、再利用をしやすくします。
これまではlogフォルダに出力するだけでしたが、以下のように登録を行うことが可能です。
通常はpklモデルを登録するのですが、ここではBayesServerのモデルファイルを登録してみました。
当然ながら、推論側で特殊な対応が必要になります。

``` amlrun.py
from azureml.core import Model
run.register_model(model_path='log/model.bayes', model_name='iris_estimator_model', tags={"Training Context":"Estimator", "Script Context":"Parameters"},
                  properties={"Accuracy":run.get_metrics()["Accuracy"]})
```

これまで空であったモデルが表示されるようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146939/c1d15638-4f9a-c695-7e6c-5ccd730ee39c.png" width="70%">


# 参考

* [Azure Machine Learning Service — Where is My Data?](https://towardsdatascience.com/azure-machine-learning-service-where-is-my-data-pjainani-86a77b93ab52)
* [DatasetConsumptionConfig クラス](https://docs.microsoft.com/ja-jp/python/api/azureml-core/azureml.data.dataset_consumption_config.datasetconsumptionconfig?view=azure-ml-py)