From 4501161967f6a7a8ef56b0ac244a44b5d6a4630b Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Tue, 17 Mar 2020 14:59:28 +0800 Subject: [PATCH 01/30] update --- multiple_specs_subfolder/add_rows.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/multiple_specs_subfolder/add_rows.yaml b/multiple_specs_subfolder/add_rows.yaml index 762d20a..3f40b08 100644 --- a/multiple_specs_subfolder/add_rows.yaml +++ b/multiple_specs_subfolder/add_rows.yaml @@ -1,6 +1,6 @@ -name: Add Rows +name: Add Rows 1 id: b2ebdabd-217d-4915-86cc-5b05972f7270 -version: 0.0.114 +version: 0.0.114.1 isDeterministic: true category: Data Transformation description: Appends a set of rows from an input dataset to the end of another dataset. From 8a8a22591f0f2c168754d2086c4ebd771ff41d27 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Tue, 17 Mar 2020 16:44:51 +0800 Subject: [PATCH 02/30] change name --- multiple_specs_subfolder/add_rows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/multiple_specs_subfolder/add_rows.yaml b/multiple_specs_subfolder/add_rows.yaml index 3f40b08..062c691 100644 --- a/multiple_specs_subfolder/add_rows.yaml +++ b/multiple_specs_subfolder/add_rows.yaml @@ -1,4 +1,4 @@ -name: Add Rows 1 +name: Add Rows id: b2ebdabd-217d-4915-86cc-5b05972f7270 version: 0.0.114.1 isDeterministic: true From 88fab5e9376b912e99e4405dd775d12030735a34 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Thu, 26 Mar 2020 16:16:24 +0800 Subject: [PATCH 03/30] add test cases --- 0_official_module/clean_missing_data.yaml | 131 ++++++++++ 1_basic_kfc/kubeflow.yaml | 19 ++ 2.2_eselect_fix_port_type/eselect.yaml | 25 ++ .../module_spec.yaml | 17 ++ 2_eselect/eselect.yaml | 24 ++ 3_basic_module/basic_module.yaml | 37 +++ 3_basic_module/module_entry.py | 6 + 4_mpi_module/module_entry.py | 6 + 4_mpi_module/mpi_module.yaml | 70 ++++++ 5_mpi_module_using_env/module_entry.py | 6 + 5_mpi_module_using_env/mpi_module.yaml | 64 +++++ 6_hdi_module/hdi_module.yaml | 36 +++ 6_hdi_module/module_entry.py | 6 + 7_kfc_merge_files/kfc.yaml | 19 ++ 7_kfc_merge_files/merge.py | 6 + 8_merge_files/merge.py | 6 + 8_merge_files/module_spec.yaml | 27 ++ 9_smart_reply_pytorch/merge.py | 6 + 9_smart_reply_pytorch/module_spec.yaml | 234 ++++++++++++++++++ build_zip.py | 19 ++ one_spec/clean_missing_data.yaml | 6 +- 21 files changed, 767 insertions(+), 3 deletions(-) create mode 100644 0_official_module/clean_missing_data.yaml create mode 100644 1_basic_kfc/kubeflow.yaml create mode 100644 2.2_eselect_fix_port_type/eselect.yaml create mode 100644 2.3_eselect_commands_with_placeholders/module_spec.yaml create mode 100644 2_eselect/eselect.yaml create mode 100644 3_basic_module/basic_module.yaml create mode 100644 3_basic_module/module_entry.py create mode 100644 4_mpi_module/module_entry.py create mode 100644 4_mpi_module/mpi_module.yaml create mode 100644 5_mpi_module_using_env/module_entry.py create mode 100644 5_mpi_module_using_env/mpi_module.yaml create mode 100644 6_hdi_module/hdi_module.yaml create mode 100644 6_hdi_module/module_entry.py create mode 100644 7_kfc_merge_files/kfc.yaml create mode 100644 7_kfc_merge_files/merge.py create mode 100644 8_merge_files/merge.py create mode 100644 8_merge_files/module_spec.yaml create mode 100644 9_smart_reply_pytorch/merge.py create mode 100644 9_smart_reply_pytorch/module_spec.yaml create mode 100644 build_zip.py diff --git a/0_official_module/clean_missing_data.yaml b/0_official_module/clean_missing_data.yaml new file mode 100644 index 0000000..a412eec --- /dev/null +++ b/0_official_module/clean_missing_data.yaml @@ -0,0 +1,131 @@ +amlModuleIdentifier: + namespace: zhizhu.com/test + moduleName: New Clean Missing Data + moduleVersion: 0.0.116.1 +isDeterministic: true +category: Data Transformation +description: Specifies how to handle the values missing from a dataset. +releaseState: Release +inputs: +- name: Dataset + type: DataFrameDirectory + port: true + description: Dataset to be cleaned +- name: Columns to be cleaned + type: ColumnPicker + description: Columns for missing values clean operation + columnPickerFor: Dataset +- name: Minimum missing value ratio + type: Float + description: Clean only column with missing value ratio above specified value, out + of set of all selected columns + default: 0.0 + min: 0.0 + max: 1.0 +- name: Maximum missing value ratio + type: Float + default: 1.0 + description: Clean only columns with missing value ratio below specified value, + out of set of all selected columns + min: 0.0 + max: 1.0 +- name: Cleaning mode + type: Mode + default: Custom substitution value + description: Algorithm to clean missing values + options: + - Custom substitution value: + - name: Replacement value + type: String + default: '0' + optional: true + description: Type the value that takes the place of missing values + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mean: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with median: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mode: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Remove entire row + - Remove entire column +outputs: +- name: Cleaned dataset + type: DataFrameDirectory + description: Cleaned dataset +- name: Cleaning transformation + type: TransformationDirectory + description: Transformation to be passed to Apply Transformation module to clean + new data +implementation: + container: + runConfig: + baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + gpuSupport: false + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 + command: + - python + - -m + - azureml.studio.modulehost.module_invoker + - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + args: + - --dataset + - inputPath: Dataset + - --columns-to-be-cleaned + - inputValue: Columns to be cleaned + - --minimum-missing-value-ratio + - inputValue: Minimum missing value ratio + - --maximum-missing-value-ratio + - inputValue: Maximum missing value ratio + - --cleaning-mode + - inputValue: Cleaning mode + - - --replacement-value + - inputValue: Replacement value + - - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column + - --cleaned-dataset + - outputPath: Cleaned dataset + - --cleaning-transformation + - outputPath: Cleaning transformation + invoking: + module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + class: CleanMissingDataModule + func: run diff --git a/1_basic_kfc/kubeflow.yaml b/1_basic_kfc/kubeflow.yaml new file mode 100644 index 0000000..51a979e --- /dev/null +++ b/1_basic_kfc/kubeflow.yaml @@ -0,0 +1,19 @@ +name: xgboost4j - Train classifier +description: Trains a boosted tree ensemble classifier using xgboost4j + +inputs: +- {name: Training data} +- {name: Rounds, type: Integer, default: '30', help: Number of training rounds} + +outputs: +- {name: Trained model, type: XGBoost model, help: Trained XGBoost model} + +implementation: + container: + image: gcr.io/ml-pipeline/xgboost-classifier-train@sha256:b3a64d57 + command: [ + /ml/train.py, + --train-set, {inputPath: Training data}, + --rounds, {inputValue: Rounds}, + --out-model, {outputPath: Trained model}, + ] diff --git a/2.2_eselect_fix_port_type/eselect.yaml b/2.2_eselect_fix_port_type/eselect.yaml new file mode 100644 index 0000000..60bdb9e --- /dev/null +++ b/2.2_eselect_fix_port_type/eselect.yaml @@ -0,0 +1,25 @@ +amlModuleIdentifier: + namespace: example.com/modules + moduleName: eselect + moduleVersion: 0.0.2 +description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. +inputs: +- name: columns + type: String +- name: input + type: AnyDirectory +outputs: +- name: output + type: AnyFile +implementation: + container: + image: ttthree/modules:latest + command: [python, /home/invoker.py] + args: + - dotnet + - /home/etools/eselect.dll + - -f + - inputValue: columns + - inputPath: input + - outputPath: output + diff --git a/2.3_eselect_commands_with_placeholders/module_spec.yaml b/2.3_eselect_commands_with_placeholders/module_spec.yaml new file mode 100644 index 0000000..7164159 --- /dev/null +++ b/2.3_eselect_commands_with_placeholders/module_spec.yaml @@ -0,0 +1,17 @@ +amlModuleIdentifier: + namespace: example.com/modules + moduleName: eselect + moduleVersion: 0.0.1 +description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. +inputs: + - {name: columns, type: String, description: 'column name list with ; as delimeter'} + - {name: input, type: AnyFile, description: 'the input file path, only TSV supported'} +outputs: + - {name: output, type: AnyFile, description: 'the output file path'} +implementation: + container: + image: ttthree/modules:latest + command: [ + python, /home/invoker.py, dotnet, /home/etools/eselect.dll, -f, {inputValue: columns}, {inputPath: input}, {outputPath: output} + ] + diff --git a/2_eselect/eselect.yaml b/2_eselect/eselect.yaml new file mode 100644 index 0000000..dafc3bf --- /dev/null +++ b/2_eselect/eselect.yaml @@ -0,0 +1,24 @@ +amlModuleIdentifier: + moduleName: eselect + moduleVersion: 0.0.1 +description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. +inputs: +- name: columns + type: String +- name: input + type: String +outputs: +- name: output + type: AnyFile +implementation: + container: + image: ttthree/modules:latest + command: [python, /home/invoker.py] + args: + - dotnet + - /home/etools/eselect.dll + - -f + - inputValue: columns + - inputPath: input + - outputPath: output + diff --git a/3_basic_module/basic_module.yaml b/3_basic_module/basic_module.yaml new file mode 100644 index 0000000..4200fdb --- /dev/null +++ b/3_basic_module/basic_module.yaml @@ -0,0 +1,37 @@ +amlModuleIdentifier: + namespace: example.com/modules + moduleName: Basic Module + moduleVersion: 0.0.2 +description: | + Basic module for demo. + No `type` specified in spec and will defaults to 'Basic'. + Demos how to specify an environment from a pre-built docker image. +metadata: + properties: + familyId: 4118f5b3-5d39-4bec-baea-230610dcbe6 + tags: [nlp, bert] + contact: AzureML Studio Team + projectUrl: http://github.com/corp/proj + documentUrl: http://readthedocs.com/proj +inputs: + - name: Input Port + type: DataFrameDirectory + - name: Parameter 1 + type: String + default: hello + - name: Parameter 2 + type: Integer + default: 1 +outputs: + - name: Output Port + type: DataFrameDirectory +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --output, { outputPath: Output Port }, + ] diff --git a/3_basic_module/module_entry.py b/3_basic_module/module_entry.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/3_basic_module/module_entry.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/4_mpi_module/module_entry.py b/4_mpi_module/module_entry.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/4_mpi_module/module_entry.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml new file mode 100644 index 0000000..5b62121 --- /dev/null +++ b/4_mpi_module/mpi_module.yaml @@ -0,0 +1,70 @@ +amlModuleIdentifier: + namespace: microsoft.com/office/demo + moduleName: Mpi Module + moduleVersion: 0.0.1 +type: Mpi +description: | + Mpi module for demo. + To create an MPI module: + * Set `type` to 'Mpi'. + * Optional: add `runConfig` to specify the specification of run-level configurations. + This module also demos: + * Input port which supports multiple data types. + * Specification of Integer / Mode parameters. + * How to use a pre-registered environment of the worksapace. +metadata: + properties: + familyId: d6b40840-256e-49e6-a25e-8ae762ec6dac + tags: [nlp, bert] + contact: AzureML Studio Team + projectUrl: http://github.com/corp/proj + documentUrl: http://readthedocs.com/proj +inputs: + - name: Input Port + type: [DataFrameDirectory, ImageDirectory] + - name: Parameter 1 + type: String + default: hello + description: Input a greeting message. + - name: Parameter 2 + type: Enum + default: Red + options: [Red, Green, Blue] + description: Choose your favorite color. + - name: Parameter 3 + type: Integer + default: 1 + min: 0 + max: 10 + description: The Integer parameter which has a range validation. +outputs: + - name: Output Port + type: DataFrameDirectory +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + max: 10 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --parameter-3, { inputValue: Parameter 3 }, + --output, { outputPath: Output Port }, + ] diff --git a/5_mpi_module_using_env/module_entry.py b/5_mpi_module_using_env/module_entry.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/5_mpi_module_using_env/module_entry.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/5_mpi_module_using_env/mpi_module.yaml b/5_mpi_module_using_env/mpi_module.yaml new file mode 100644 index 0000000..b8c0e13 --- /dev/null +++ b/5_mpi_module_using_env/mpi_module.yaml @@ -0,0 +1,64 @@ +amlModuleIdentifier: + namespace: microsoft.com/office/demo + moduleName: Mpi Module + moduleVersion: 0.0.1 +type: Mpi +description: | + Mpi module for demo. + To create an MPI module: + * Set `type` to 'Mpi'. + * Optional: add `runConfig` to specify the specification of run-level configurations. + This module also demos: + * Input port which supports multiple data types. + * Specification of Integer / Mode parameters. + * How to use a pre-registered environment of the worksapace. +metadata: + properties: + familyId: d6b40840-256e-49e6-a25e-8ae762ec6dac + tags: [nlp, bert] + contact: AzureML Studio Team + projectUrl: http://github.com/corp/proj + documentUrl: http://readthedocs.com/proj +inputs: + - name: Input Port + type: [DataFrameDirectory, ImageDirectory] + - name: Parameter 1 + type: String + default: hello + description: Input a greeting message. + - name: Parameter 2 + type: Enum + default: Red + options: [Red, Green, Blue] + description: Choose your favorite color. + - name: Parameter 3 + type: Integer + default: 1 + min: 0 + max: 10 + description: The Integer parameter which has a range validation. +outputs: + - name: Output Port + type: DataFrameDirectory +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + max: 10 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + environment: + name: DemoEnv + version: 0.0.1 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --parameter-3, { inputValue: Parameter 3 }, + --output, { outputPath: Output Port }, + ] diff --git a/6_hdi_module/hdi_module.yaml b/6_hdi_module/hdi_module.yaml new file mode 100644 index 0000000..30db54b --- /dev/null +++ b/6_hdi_module/hdi_module.yaml @@ -0,0 +1,36 @@ +amlModuleIdentifier: + namespace: microsoft.com/office/demo + moduleName: HDInsight Module + moduleVersion: 0.0.1 +type: HDInsight +description: | + HDInsight module for demo. +metadata: + properties: + familyId: ffe7745f-e041-4374-8197-7c37d5a8f135 + tags: [nlp, bert] + contact: AzureML Studio Team + projectUrl: http://github.com/corp/proj + documentUrl: http://readthedocs.com/proj +inputs: + - name: Input Port + type: DataFrameDirectory + - name: Parameter 1 + type: String + default: hello + - name: Parameter 2 + type: Integer + default: 1 +outputs: + - name: Output Port + type: DataFrameDirectory +implementation: + container: + image: office/module_runner_docker + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --output, { outputPath: Output Port }, + ] diff --git a/6_hdi_module/module_entry.py b/6_hdi_module/module_entry.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/6_hdi_module/module_entry.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/7_kfc_merge_files/kfc.yaml b/7_kfc_merge_files/kfc.yaml new file mode 100644 index 0000000..9c3add3 --- /dev/null +++ b/7_kfc_merge_files/kfc.yaml @@ -0,0 +1,19 @@ +name: Merge every n files together cdd3b0ba +inputs: +- name: InputFolder + type: LocalPath +- name: merge_count + type: Integer + default: '100' + optional: true +outputs: +- name: OutputFolder + type: LocalPath +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/7_kfc_merge_files/merge.py b/7_kfc_merge_files/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/7_kfc_merge_files/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/8_merge_files/merge.py b/8_merge_files/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/8_merge_files/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/8_merge_files/module_spec.yaml b/8_merge_files/module_spec.yaml new file mode 100644 index 0000000..93b255e --- /dev/null +++ b/8_merge_files/module_spec.yaml @@ -0,0 +1,27 @@ +amlModuleIdentifier: + namespace: microsoft.com/office + moduleName: Merge every n files together + version: 0.0.2 +metadata: + annotations: + familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 + labels: + - Office +inputs: +- name: InputFolder + type: [AzureEncryptedBlobReference, AnyDirectory] +- name: merge_count + type: Integer + default: 100 + optional: true +outputs: +- name: OutputFolder + type: AzureEncryptedBlobReference +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/9_smart_reply_pytorch/merge.py b/9_smart_reply_pytorch/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/9_smart_reply_pytorch/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml new file mode 100644 index 0000000..6f2e806 --- /dev/null +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -0,0 +1,234 @@ +amlModuleIdentifier: + namespace: microsoft.com/office + moduleName: [AE365][SmartReply][AML][Test] PyTorch Distributed + version: 0.0.2.0309172714 +type: Mpi +metadata: + annotations: + familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d + labels: + - Office + - AE365 + - SmartReply + - AML + - Test +inputs: +- name: train_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: valid_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: gmr_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: vocab_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: rsp_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: pretrained_model_path + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: model_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: architecture + type: Enum + default: bert_matching_model + options: + - matching_model + - bert_matching_model +- name: pretrained_model_file + type: Enum + default: bert_encoder_epoch_500.pt + options: + - bert_encoder_epoch_500.pt + optional: true +- name: run_mode + type: Enum + default: train + options: + - train + - eval + - export +- name: load_from + type: Enum + default: tnlr + options: + - bert + - tnlr + optional: true +- name: max_epochs + type: Integer + default: 5 + optional: true +- name: lm_alpha + type: Float + default: 1.4 + optional: true +- name: batch_size + type: Integer + default: 256 + optional: true +- name: batch_size_infer + type: Integer + default: 256 + optional: true +- name: learning_rate + type: Float + default: 3e-4 + optional: true +- name: max_msg_len + type: Integer + default: 64 + optional: true +- name: max_rsp_len + type: Integer + default: 64 + optional: true +- name: decay_step + type: Integer + default: 2000 + optional: true +- name: decay_rate + type: Float + default: 0.99 + optional: true +- name: warmup_proportion + type: Float + default: 0.0002 + optional: true +- name: loss_scale + type: Integer + default: 0 + optional: true +- name: tokenizer + type: Enum + default: wordpiece + options: + - wordpiece + - sentencepiece + optional: true +- name: gradient_accumulation_steps + type: Integer + default: 1 + optional: true +- name: optimizer + type: Enum + default: adam + options: + - adam + - adadelta + optional: true +- name: validation_freq + type: Integer + default: -1 + optional: true +- name: save_freq + type: Integer + default: -1 + optional: true +- name: manual_seed + type: Integer + default: 42 + optional: true +- name: infer_batches + type: Integer + default: 1000 + optional: true +outputs: +- name: model_output_dir + type: AzureEncryptedBlobReference +- name: eval_output_dir + type: AzureEncryptedBlobReference +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + image: mcr.microsoft.com/azureml/bert:pretrain-openmpi3.1.2-cuda10.0-cudnn7-ubuntu16.04 + command: [/opt/miniconda/envs/amlbert/bin/python, smartreply/models/matching/driver.py] + args: + - --train_input_dir + - inputPath: train_input_dir + - --valid_input_dir + - inputPath: valid_input_dir + - --gmr_input_dir + - inputPath: gmr_input_dir + - --vocab_input_dir + - inputPath: vocab_input_dir + - --rsp_input_dir + - inputPath: rsp_input_dir + - --pretrained_model_path + - inputPath: pretrained_model_path + - --model_input_dir + - inputPath: model_input_dir + - --model_output_dir + - outputPath: model_output_dir + - --eval_output_dir + - outputPath: eval_output_dir + - --architecture + - inputValue: architecture + - --pretrained_model_file + - inputValue: pretrained_model_file + - --run_mode + - inputValue: run_mode + - --load_from + - inputValue: load_from + - --max_epochs + - inputValue: max_epochs + - --lm_alpha + - inputValue: lm_alpha + - --batch_size + - inputValue: batch_size + - --batch_size_infer + - inputValue: batch_size_infer + - --learning_rate + - inputValue: learning_rate + - --max_msg_len + - inputValue: max_msg_len + - --max_rsp_len + - inputValue: max_rsp_len + - --decay_step + - inputValue: decay_step + - --decay_rate + - inputValue: decay_rate + - --warmup_proportion + - inputValue: warmup_proportion + - --loss_scale + - inputValue: loss_scale + - --tokenizer + - inputValue: tokenizer + - --gradient_accumulation_steps + - inputValue: gradient_accumulation_steps + - --optimizer + - inputValue: optimizer + - --validation_freq + - inputValue: validation_freq + - --save_freq + - inputValue: save_freq + - --manual_seed + - inputValue: manual_seed + - --infer_batches + - inputValue: infer_batches diff --git a/build_zip.py b/build_zip.py new file mode 100644 index 0000000..cc5e79d --- /dev/null +++ b/build_zip.py @@ -0,0 +1,19 @@ +import os + +from pathlib import Path +from zipfile import ZipFile, ZIP_DEFLATED + + +def create_zip(path): + with ZipFile(f'{path}.zip', 'w', ZIP_DEFLATED) as zipf: + for root, dirs, files in os.walk(path): + for f in files: + print(f'Zipping {f}...') + zipf.write(os.path.join(root, f)) + + +if __name__ == '__main__': + for p in Path('.').iterdir(): + if p.is_dir(): + print(f'Processing {p} ...') + create_zip(p) diff --git a/one_spec/clean_missing_data.yaml b/one_spec/clean_missing_data.yaml index a3c4eb2..7b4a0de 100644 --- a/one_spec/clean_missing_data.yaml +++ b/one_spec/clean_missing_data.yaml @@ -1,6 +1,6 @@ -name: Clean Missing Data -id: d2c5ca2f-7323-41a3-9b7e-da917c99f0c4 -version: 0.0.115.1 +name: My Awesome Module +id: d2c5ca2f-7323-41a3-900e-da917c99f0c4 +version: 0.0.6.6 isDeterministic: true category: Data Transformation description: Specifies how to handle the values missing from a dataset. From 5367c9e9ce84528f34d2ed456110a99799ddbc4f Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Thu, 26 Mar 2020 18:37:09 +0800 Subject: [PATCH 04/30] add quote to module name --- 9_smart_reply_pytorch/module_spec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index 6f2e806..ab982ad 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,6 +1,6 @@ amlModuleIdentifier: namespace: microsoft.com/office - moduleName: [AE365][SmartReply][AML][Test] PyTorch Distributed + moduleName: "[AE365][SmartReply][AML][Test] PyTorch Distributed" version: 0.0.2.0309172714 type: Mpi metadata: From c1236b949ef531d40218b0e97866ddec506e6fc5 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Thu, 26 Mar 2020 18:45:10 +0800 Subject: [PATCH 05/30] rename key --- 8_merge_files/module_spec.yaml | 2 +- 9_smart_reply_pytorch/module_spec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/8_merge_files/module_spec.yaml b/8_merge_files/module_spec.yaml index 93b255e..a249e4f 100644 --- a/8_merge_files/module_spec.yaml +++ b/8_merge_files/module_spec.yaml @@ -1,7 +1,7 @@ amlModuleIdentifier: namespace: microsoft.com/office moduleName: Merge every n files together - version: 0.0.2 + moduleVersion: 0.0.2 metadata: annotations: familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index ab982ad..9386c5f 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,7 +1,7 @@ amlModuleIdentifier: namespace: microsoft.com/office moduleName: "[AE365][SmartReply][AML][Test] PyTorch Distributed" - version: 0.0.2.0309172714 + moduleVersion: 0.0.2.0309172714 type: Mpi metadata: annotations: From a78b70170bb657cde04b938a138a594fc12a92d4 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Thu, 26 Mar 2020 22:43:02 +0800 Subject: [PATCH 06/30] add invalid yamls --- 10_invalid_yaml/invalid.yaml | 1 + 10_invalid_yaml/invalid2.yaml | 1 + 10_invalid_yaml/invalid3.yaml | 1 + 10_invalid_yaml/invalid4.yaml | 6 + 10_invalid_yaml/merge.py | 6 + 10_invalid_yaml/module_spec.yaml | 234 +++++++++++++++++++++++++++++++ 6 files changed, 249 insertions(+) create mode 100644 10_invalid_yaml/invalid.yaml create mode 100644 10_invalid_yaml/invalid2.yaml create mode 100644 10_invalid_yaml/invalid3.yaml create mode 100644 10_invalid_yaml/invalid4.yaml create mode 100644 10_invalid_yaml/merge.py create mode 100644 10_invalid_yaml/module_spec.yaml diff --git a/10_invalid_yaml/invalid.yaml b/10_invalid_yaml/invalid.yaml new file mode 100644 index 0000000..8507427 --- /dev/null +++ b/10_invalid_yaml/invalid.yaml @@ -0,0 +1 @@ +hello: diff --git a/10_invalid_yaml/invalid2.yaml b/10_invalid_yaml/invalid2.yaml new file mode 100644 index 0000000..843842c --- /dev/null +++ b/10_invalid_yaml/invalid2.yaml @@ -0,0 +1 @@ +incomplete_list: [ diff --git a/10_invalid_yaml/invalid3.yaml b/10_invalid_yaml/invalid3.yaml new file mode 100644 index 0000000..7cc86ad --- /dev/null +++ b/10_invalid_yaml/invalid3.yaml @@ -0,0 +1 @@ +666 diff --git a/10_invalid_yaml/invalid4.yaml b/10_invalid_yaml/invalid4.yaml new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/10_invalid_yaml/invalid4.yaml @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/10_invalid_yaml/merge.py b/10_invalid_yaml/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/10_invalid_yaml/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/10_invalid_yaml/module_spec.yaml b/10_invalid_yaml/module_spec.yaml new file mode 100644 index 0000000..9c4ea99 --- /dev/null +++ b/10_invalid_yaml/module_spec.yaml @@ -0,0 +1,234 @@ +amlModuleIdentifier: + namespace: microsoft.com/office + moduleName: [AE365][SmartReply][AML][Test] PyTorch Distributed + moduleVersion: 0.0.2.0309172714 +type: Mpi +metadata: + annotations: + familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d + labels: + - Office + - AE365 + - SmartReply + - AML + - Test +inputs: +- name: train_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: valid_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: gmr_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: vocab_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: rsp_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: pretrained_model_path + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: model_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: architecture + type: Enum + default: bert_matching_model + options: + - matching_model + - bert_matching_model +- name: pretrained_model_file + type: Enum + default: bert_encoder_epoch_500.pt + options: + - bert_encoder_epoch_500.pt + optional: true +- name: run_mode + type: Enum + default: train + options: + - train + - eval + - export +- name: load_from + type: Enum + default: tnlr + options: + - bert + - tnlr + optional: true +- name: max_epochs + type: Integer + default: 5 + optional: true +- name: lm_alpha + type: Float + default: 1.4 + optional: true +- name: batch_size + type: Integer + default: 256 + optional: true +- name: batch_size_infer + type: Integer + default: 256 + optional: true +- name: learning_rate + type: Float + default: 3e-4 + optional: true +- name: max_msg_len + type: Integer + default: 64 + optional: true +- name: max_rsp_len + type: Integer + default: 64 + optional: true +- name: decay_step + type: Integer + default: 2000 + optional: true +- name: decay_rate + type: Float + default: 0.99 + optional: true +- name: warmup_proportion + type: Float + default: 0.0002 + optional: true +- name: loss_scale + type: Integer + default: 0 + optional: true +- name: tokenizer + type: Enum + default: wordpiece + options: + - wordpiece + - sentencepiece + optional: true +- name: gradient_accumulation_steps + type: Integer + default: 1 + optional: true +- name: optimizer + type: Enum + default: adam + options: + - adam + - adadelta + optional: true +- name: validation_freq + type: Integer + default: -1 + optional: true +- name: save_freq + type: Integer + default: -1 + optional: true +- name: manual_seed + type: Integer + default: 42 + optional: true +- name: infer_batches + type: Integer + default: 1000 + optional: true +outputs: +- name: model_output_dir + type: AzureEncryptedBlobReference +- name: eval_output_dir + type: AzureEncryptedBlobReference +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + image: mcr.microsoft.com/azureml/bert:pretrain-openmpi3.1.2-cuda10.0-cudnn7-ubuntu16.04 + command: [/opt/miniconda/envs/amlbert/bin/python, smartreply/models/matching/driver.py] + args: + - --train_input_dir + - inputPath: train_input_dir + - --valid_input_dir + - inputPath: valid_input_dir + - --gmr_input_dir + - inputPath: gmr_input_dir + - --vocab_input_dir + - inputPath: vocab_input_dir + - --rsp_input_dir + - inputPath: rsp_input_dir + - --pretrained_model_path + - inputPath: pretrained_model_path + - --model_input_dir + - inputPath: model_input_dir + - --model_output_dir + - outputPath: model_output_dir + - --eval_output_dir + - outputPath: eval_output_dir + - --architecture + - inputValue: architecture + - --pretrained_model_file + - inputValue: pretrained_model_file + - --run_mode + - inputValue: run_mode + - --load_from + - inputValue: load_from + - --max_epochs + - inputValue: max_epochs + - --lm_alpha + - inputValue: lm_alpha + - --batch_size + - inputValue: batch_size + - --batch_size_infer + - inputValue: batch_size_infer + - --learning_rate + - inputValue: learning_rate + - --max_msg_len + - inputValue: max_msg_len + - --max_rsp_len + - inputValue: max_rsp_len + - --decay_step + - inputValue: decay_step + - --decay_rate + - inputValue: decay_rate + - --warmup_proportion + - inputValue: warmup_proportion + - --loss_scale + - inputValue: loss_scale + - --tokenizer + - inputValue: tokenizer + - --gradient_accumulation_steps + - inputValue: gradient_accumulation_steps + - --optimizer + - inputValue: optimizer + - --validation_freq + - inputValue: validation_freq + - --save_freq + - inputValue: save_freq + - --manual_seed + - inputValue: manual_seed + - --infer_batches + - inputValue: infer_batches From 922f164aac9e8ff6c5f61a905a6c4e7dd0d320e2 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:20:57 +0800 Subject: [PATCH 07/30] rename namespace --- 4_mpi_module/mpi_module.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 5b62121..4ad9631 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -1,5 +1,5 @@ amlModuleIdentifier: - namespace: microsoft.com/office/demo + namespace: microsoft.com/office moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi From 905cf2c76b548a80ec8db5f2a1bd5900b9dfca92 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:24:02 +0800 Subject: [PATCH 08/30] update datatype --- 4_mpi_module/mpi_module.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 4ad9631..152fcb6 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -21,7 +21,7 @@ metadata: documentUrl: http://readthedocs.com/proj inputs: - name: Input Port - type: [DataFrameDirectory, ImageDirectory] + type: [AnyFile, AnyDirectory] - name: Parameter 1 type: String default: hello @@ -39,7 +39,7 @@ inputs: description: The Integer parameter which has a range validation. outputs: - name: Output Port - type: DataFrameDirectory + type: AnyDirectory runConfig: nodeCount: type: Integer From 9c6df3bbfec336285b401d12e2ed47b365906962 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:26:23 +0800 Subject: [PATCH 09/30] update description --- 4_mpi_module/mpi_module.yaml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 152fcb6..3925a41 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -3,15 +3,7 @@ amlModuleIdentifier: moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi -description: | - Mpi module for demo. - To create an MPI module: - * Set `type` to 'Mpi'. - * Optional: add `runConfig` to specify the specification of run-level configurations. - This module also demos: - * Input port which supports multiple data types. - * Specification of Integer / Mode parameters. - * How to use a pre-registered environment of the worksapace. +description: Mpi module for demo. metadata: properties: familyId: d6b40840-256e-49e6-a25e-8ae762ec6dac From d68c211ec19124896a59ffdec68d120ef62739e5 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 15:29:29 +0800 Subject: [PATCH 10/30] update testcases --- 0_official_module/invoker.py | 36 ++++++++++++++++ 1_basic_kfc/ml/train.py | 36 ++++++++++++++++ 3_basic_module/basic_module.yaml | 4 +- 4_mpi_module/mpi_module.yaml | 41 +++++++++++-------- 5_mpi_module_using_env/mpi_module.yaml | 6 +-- 6_hdi_module/hdi_module.yaml | 4 +- .../kfc.yaml | 21 ++++++++++ .../merge.py | 6 +++ 8_merge_files/module_spec.yaml | 4 +- 9_smart_reply_pytorch/module_spec.yaml | 6 +-- .../smartreply/models/matching/driver.py | 6 +++ 11 files changed, 139 insertions(+), 31 deletions(-) create mode 100644 0_official_module/invoker.py create mode 100644 1_basic_kfc/ml/train.py create mode 100644 7.1_kfc_merge_files_add_aml_identifier/kfc.yaml create mode 100644 7.1_kfc_merge_files_add_aml_identifier/merge.py create mode 100644 9_smart_reply_pytorch/smartreply/models/matching/driver.py diff --git a/0_official_module/invoker.py b/0_official_module/invoker.py new file mode 100644 index 0000000..4eba60d --- /dev/null +++ b/0_official_module/invoker.py @@ -0,0 +1,36 @@ +import subprocess +import sys + + +def run(command: list, timeout=60000): + if not command: + return + + return subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr).wait(timeout=timeout) + + +INVOKER_VERSION = '0.0.6' + + +def is_invoking_official_module(args): + return len(args) >= 3 and args[0] == 'python' and args[1] == '-m' and args[2].startswith('azureml.studio.') + + +def generate_run_command(args): + return [arg for arg in args] + + +def execute(args): + is_custom_module = not is_invoking_official_module(args) + module_type = 'custom module' if is_custom_module else 'official module' + print('Invoking {} by invoker {}.'.format(module_type, INVOKER_VERSION)) + + ret = run(generate_run_command(args)) + + # set the subprocess run result as exit value + exit(ret) + + +if __name__ == '__main__': + args = sys.argv[1:] + execute(args) diff --git a/1_basic_kfc/ml/train.py b/1_basic_kfc/ml/train.py new file mode 100644 index 0000000..4eba60d --- /dev/null +++ b/1_basic_kfc/ml/train.py @@ -0,0 +1,36 @@ +import subprocess +import sys + + +def run(command: list, timeout=60000): + if not command: + return + + return subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr).wait(timeout=timeout) + + +INVOKER_VERSION = '0.0.6' + + +def is_invoking_official_module(args): + return len(args) >= 3 and args[0] == 'python' and args[1] == '-m' and args[2].startswith('azureml.studio.') + + +def generate_run_command(args): + return [arg for arg in args] + + +def execute(args): + is_custom_module = not is_invoking_official_module(args) + module_type = 'custom module' if is_custom_module else 'official module' + print('Invoking {} by invoker {}.'.format(module_type, INVOKER_VERSION)) + + ret = run(generate_run_command(args)) + + # set the subprocess run result as exit value + exit(ret) + + +if __name__ == '__main__': + args = sys.argv[1:] + execute(args) diff --git a/3_basic_module/basic_module.yaml b/3_basic_module/basic_module.yaml index 4200fdb..4d2c3cd 100644 --- a/3_basic_module/basic_module.yaml +++ b/3_basic_module/basic_module.yaml @@ -8,11 +8,9 @@ description: | Demos how to specify an environment from a pre-built docker image. metadata: properties: - familyId: 4118f5b3-5d39-4bec-baea-230610dcbe6 tags: [nlp, bert] contact: AzureML Studio Team - projectUrl: http://github.com/corp/proj - documentUrl: http://readthedocs.com/proj + helpDocument: http://readthedocs.com/proj inputs: - name: Input Port type: DataFrameDirectory diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 3925a41..cbd5417 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -1,19 +1,25 @@ amlModuleIdentifier: - namespace: microsoft.com/office + namespace: microsoft.com/office/demo moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi -description: Mpi module for demo. +description: | + Mpi module for demo. + To create an MPI module: + * Set `type` to 'Mpi'. + * Optional: add `runConfig` to specify the specification of run-level configurations. + This module also demos: + * Input port which supports multiple data types. + * Specification of Integer / Mode parameters. + * How to use a pre-registered environment of the worksapace. metadata: properties: - familyId: d6b40840-256e-49e6-a25e-8ae762ec6dac tags: [nlp, bert] contact: AzureML Studio Team - projectUrl: http://github.com/corp/proj - documentUrl: http://readthedocs.com/proj + helpDocument: http://readthedocs.com/proj inputs: - name: Input Port - type: [AnyFile, AnyDirectory] + type: [DataFrameDirectory, ImageDirectory] - name: Parameter 1 type: String default: hello @@ -31,7 +37,7 @@ inputs: description: The Integer parameter which has a range validation. outputs: - name: Output Port - type: AnyDirectory + type: DataFrameDirectory runConfig: nodeCount: type: Integer @@ -43,15 +49,18 @@ runConfig: default: 2 implementation: container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.116 + amlEnvironment: + docker: + baseImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + python: + condaDenpendencies: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 command: [python, module_entry.py] args: [ --input, {inputPath: Input Port }, diff --git a/5_mpi_module_using_env/mpi_module.yaml b/5_mpi_module_using_env/mpi_module.yaml index b8c0e13..18a7eb9 100644 --- a/5_mpi_module_using_env/mpi_module.yaml +++ b/5_mpi_module_using_env/mpi_module.yaml @@ -14,11 +14,9 @@ description: | * How to use a pre-registered environment of the worksapace. metadata: properties: - familyId: d6b40840-256e-49e6-a25e-8ae762ec6dac tags: [nlp, bert] contact: AzureML Studio Team - projectUrl: http://github.com/corp/proj - documentUrl: http://readthedocs.com/proj + helpDocument: http://readthedocs.com/proj inputs: - name: Input Port type: [DataFrameDirectory, ImageDirectory] @@ -51,7 +49,7 @@ runConfig: default: 2 implementation: container: - environment: + amlEnvironment: name: DemoEnv version: 0.0.1 command: [python, module_entry.py] diff --git a/6_hdi_module/hdi_module.yaml b/6_hdi_module/hdi_module.yaml index 30db54b..7adc4c7 100644 --- a/6_hdi_module/hdi_module.yaml +++ b/6_hdi_module/hdi_module.yaml @@ -7,11 +7,9 @@ description: | HDInsight module for demo. metadata: properties: - familyId: ffe7745f-e041-4374-8197-7c37d5a8f135 tags: [nlp, bert] contact: AzureML Studio Team - projectUrl: http://github.com/corp/proj - documentUrl: http://readthedocs.com/proj + helpDocument: http://readthedocs.com/proj inputs: - name: Input Port type: DataFrameDirectory diff --git a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml new file mode 100644 index 0000000..53d831c --- /dev/null +++ b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml @@ -0,0 +1,21 @@ +amlIdentifier: + moduleName: Merge every n files together cdd3b0ba + version: 0.0.1 +inputs: +- name: InputFolder + type: LocalPath +- name: merge_count + type: Integer + default: '100' + optional: true +outputs: +- name: OutputFolder + type: LocalPath +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/7.1_kfc_merge_files_add_aml_identifier/merge.py b/7.1_kfc_merge_files_add_aml_identifier/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/7.1_kfc_merge_files_add_aml_identifier/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + diff --git a/8_merge_files/module_spec.yaml b/8_merge_files/module_spec.yaml index a249e4f..588389a 100644 --- a/8_merge_files/module_spec.yaml +++ b/8_merge_files/module_spec.yaml @@ -1,11 +1,11 @@ amlModuleIdentifier: namespace: microsoft.com/office moduleName: Merge every n files together - moduleVersion: 0.0.2 + version: 0.0.2 metadata: annotations: familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 - labels: + tags: - Office inputs: - name: InputFolder diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index 9386c5f..c53f1aa 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,12 +1,12 @@ amlModuleIdentifier: namespace: microsoft.com/office - moduleName: "[AE365][SmartReply][AML][Test] PyTorch Distributed" - moduleVersion: 0.0.2.0309172714 + moduleName: '[AE365][SmartReply][AML][Test] PyTorch Distributed' + version: 0.0.2.0309172714 type: Mpi metadata: annotations: familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d - labels: + tags: - Office - AE365 - SmartReply diff --git a/9_smart_reply_pytorch/smartreply/models/matching/driver.py b/9_smart_reply_pytorch/smartreply/models/matching/driver.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/9_smart_reply_pytorch/smartreply/models/matching/driver.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + From b60b2b32d2a7573d057d707beb93749205154759 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 15:30:24 +0800 Subject: [PATCH 11/30] add zipped testcases --- 0_official_module.zip | Bin 0 -> 1855 bytes 10_invalid_yaml.zip | Bin 0 -> 2126 bytes 1_basic_kfc.zip | Bin 0 -> 1003 bytes 2.2_eselect_fix_port_type.zip | Bin 0 -> 511 bytes 2.3_eselect_commands_with_placeholders.zip | Bin 0 -> 592 bytes 2_eselect.zip | Bin 0 -> 455 bytes 3_basic_module.zip | Bin 0 -> 862 bytes 4_mpi_module.zip | Bin 0 -> 1218 bytes 5_mpi_module_using_env.zip | Bin 0 -> 1132 bytes 6_hdi_module.zip | Bin 0 -> 765 bytes 7.1_kfc_merge_files_add_aml_identifier.zip | Bin 0 -> 695 bytes 7_kfc_merge_files.zip | Bin 0 -> 587 bytes 8_merge_files.zip | Bin 0 -> 709 bytes 9_smart_reply_pytorch.zip | Bin 0 -> 1773 bytes multiple_specs.zip | Bin 0 -> 4117 bytes multiple_specs_subfolder.zip | Bin 0 -> 4298 bytes no_spec.zip | Bin 0 -> 2075 bytes one_spec.zip | Bin 0 -> 3336 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 0_official_module.zip create mode 100644 10_invalid_yaml.zip create mode 100644 1_basic_kfc.zip create mode 100644 2.2_eselect_fix_port_type.zip create mode 100644 2.3_eselect_commands_with_placeholders.zip create mode 100644 2_eselect.zip create mode 100644 3_basic_module.zip create mode 100644 4_mpi_module.zip create mode 100644 5_mpi_module_using_env.zip create mode 100644 6_hdi_module.zip create mode 100644 7.1_kfc_merge_files_add_aml_identifier.zip create mode 100644 7_kfc_merge_files.zip create mode 100644 8_merge_files.zip create mode 100644 9_smart_reply_pytorch.zip create mode 100644 multiple_specs.zip create mode 100644 multiple_specs_subfolder.zip create mode 100644 no_spec.zip create mode 100644 one_spec.zip diff --git a/0_official_module.zip b/0_official_module.zip new file mode 100644 index 0000000000000000000000000000000000000000..184621f8d8d164fa0b87c633c453ac1ae09ff213 GIT binary patch literal 1855 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 b^e~6|4-$z1-mIVqXJ7-u{frC@m0%tKnV(cd literal 0 HcmV?d00001 diff --git a/1_basic_kfc.zip b/1_basic_kfc.zip new file mode 100644 index 0000000000000000000000000000000000000000..3e3d88996b5baf43a896683cad40a3db186637a1 GIT binary patch literal 1003 zcmWIWW@Zs#U|`^2SXo^c;Nie`#gLJK!Ig=DK@uox7@w3_oS7V-otCVhU7D1dmXlwu zSDBcblRLrJ`-p)++xwrQ#kajTYrkv1Fu6idUr9-+qdn93t=lJ8y922=|L2+IzSVkW zHnV)5q+Ii?tRJtWvz_nMFtv;KUvgM&z;e^`lTSd#-jcwmVE(%d9H|W~F8(YjOfTIo z9+g<4;A=lwa`LgI5?RL{W}Lcq$f}*i&F1X?^JbEQS{>}uSF;PRRF7|5z&E+eROecF zH`li%F}(er=9M$weo|CEJN=_@vf0u9X3rLH6V zu=c7{?}~?er!Yuv)%v*9I^?muJcCWZng=N(%H?=@D06TLOM79HiQ*^>IWCve+chxN>B8@4!#XI5{17M{!XV7c{%zJxxR zjbChnzHHOD_r`VWugTIMrq;1G-a2yn=m;-Szh3lGx?aYpXJ2q^otN+PB^D47<5`gJA1z z-5Q2#>?iN8=iiX}?4gr-`cdgR+lS$4jeG4kWIWZ}lVLU0skU3r_k2Xo*43_4TV*dU z3U8T|uKU^G-=d830ww3v^DdO>6rK?IAv)V*|CfVr%?u|P?{uH%e(OU0asxI0h9##b zd^+MXC2-=jzwFlE7#+{_6u-~Wc^+&x+sHivi5x^2{T%Jrt`pKa$? zRqa)pHs#!>`^BdhzE>zPm|IX-tU1}z=?!PdgM*n(n_nsSNuJc*=@i9VuDLXnZK+JS z_R_#xUYg5(E_2dRiB+5Z{O{Li6EwwEYt%6Xcr!AIFyqcjz*q)@C5<2oXU0M|20f)f j3}Ikc(wG5EKgh-)rJDe6RyL4ACLrtq(w@L%#=rmo2n4Cw literal 0 HcmV?d00001 diff --git a/2.2_eselect_fix_port_type.zip b/2.2_eselect_fix_port_type.zip new file mode 100644 index 0000000000000000000000000000000000000000..5a5432e08a4a54f88a87ef9530eaeafed815d280 GIT binary patch literal 511 zcmWIWW@Zs#U|`^2SXo^c&@unKTp%L@!#pMi1~s6lk)Ba}YH?~#YH~?@T4qIjL4Hw5 zd`V?NsyecHw3tXER>~?SlUAS~g>5%w|P@#h#_NTjg*2%2n(0*57V7)me^=$ZkzP7mNqBYjO z8}%5L>nvR$waT%6DsS7WW4G6yy`s|c^P6wRA&-<554m?OpRuLfbl$4vuZk}QWi8^H zvoLmI=YF2I`c1d=evdofcLi^moyc;uR`ald^1ZU^C5kNaGovPc zW3ErAbNj#eq|cr*L08+qo2IG;%$(jTt-qAV^4!ysEurog)1KK0t(6XxK04*cp-HJ5 zKk=K^#VmN)GO_x-S59?)=IXoo|GSe!-8R0sDY#z$$i3NHV#QWx^=fW>={4t5!M9U9 z*XLWU|4@E%V^8IwXC1~C_s@&#+jl>b5AbGW5@E(2t-zQCgC&h1ip)q3@MdKLX=en& MR3Lp7m~I#t006)Fg#Z8m literal 0 HcmV?d00001 diff --git a/2_eselect.zip b/2_eselect.zip new file mode 100644 index 0000000000000000000000000000000000000000..8bf92427b1bcafb7984a7b459e021d557fc41cd1 GIT binary patch literal 455 zcmWIWW@Zs#U|`^2SXo^cz%-S=+>()jp^S-vK@2Er6rWn0nvaQUeY1 zS_}lKyD zPd-}hc7B<;#OzHB1(G%4e9{M6#H{Z^U2?n1oA;o;gY4ipQ-8-^Za%C9I2FvGmm#f=-*v-OzYT@*=v-as}wTNPkc7<596ze zGS`m%zhHh$>rDLYh@*;cb@~=`+J2IY+%~Z@XVvxk=*;Zzvy%7EFH%oWUH+Tt{R{r1 zkJs&$-o9nagzd*pJrWP_W@Hj!#vR+ literal 0 HcmV?d00001 diff --git a/3_basic_module.zip b/3_basic_module.zip new file mode 100644 index 0000000000000000000000000000000000000000..09c79ecc178bc30afc39578f1412460c84e24c9e GIT binary patch literal 862 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&e6jY#g7ISe%(0pPQdjnv<#zq2g2XN{TA= z3Mx;Z(LJHB6{xXJ=h>r2r+k7t`p@|_puhjT@0l~*{o&gm1u--=EjqJD zh<8EI-Xn{?82ReyF$AF4TgSh<;0GfE!%Joc1_exeksYB|nV6f?8+1EM#8IGj{`wW$ z_q;h5Co<8^B~?(&hsWiU(!nd=uDsjwt@oYO<^t$VpIOf1aJim}-7^x|b*7k?w|R}MFe7`MpY(OfHB(ck=x zw7oVJy?_)CnU7t ztmuxC#?=R&%x>_V^xtmDKR4D%Zw^@`#w5KfsQQrQwDZw|Hw#7ju63>P-mO0KHD_`5 zOg<66m8*~O{@H%5f9V(bq|kfY->^+9&FmA?jxHC@3SsKudD}Uk`wXYV-W!Q33nv-n z?upV5*T0?qIng{qE=>Q{)6dB{$ClK3RsNb-ot}O?_0Oa_nPb=bO=EdfKNtDs&z#Pa z_F;96{>0yz93RrZaeUz~I~&f)$6DW8WpVaF=CNP*d%jKyj6L_DYE_k*n|(w6tm*)7 zMkWzv-02mVbiiOqBZ$JEdeO~7PlFJX7#Nl`R$!Wiks<@US=m53n1FB=kY2|G;sF2? CAYxwt literal 0 HcmV?d00001 diff --git a/4_mpi_module.zip b/4_mpi_module.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e3bf75641d7562922e2fbbc969178e811f2bf5c GIT binary patch literal 1218 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&b)&Y!aVakQtwwpHiBWst=*!Q}arSD)kB~ zPoL2}p|2IFu}gh2ApxDZGMNcS$nSo&!J2qS44$!Mi%*|;Hy`O*Ef~W3#{K4&v&Tsxm zbsdaoe|zh0Y{P4@HAmyxl0s8&UGtsB;+Z#n_uG1TRm+u=m#v6T3YI_V|HQqm^pjKg z-Xo!{r@EsS=o&K|wJK>V)LAHeCu@0je8FAc(pc`k%UssJ8}xS7sT6REyE$-ewf@m` zjdQKn4AIR=^M3Yv?pWh=e64|<+&`6?0zbQeY;MIG$7kBSca%PJ_#8Z1Wtza`T){d0 z#X~igy^QN0vL3AnTr%0;&}6dehE+|{w^tjl&ARBa!1#pgUdH>6KImC+S6na^FqvM_ zE>!X5MXpWJL|^SY(^Mz>xzEZ|*c`O%d%~8l1^2n`HNE!zq0}E&m3U%#(mclpui0iz zZ@(FSD!Ex~*}_R2ZIN1QmuvCy)xZ8-(0osj(Lk)YySISl09U|W&efsrxjYLGy?wX! z@4JYM6ju^o40Pq~DqT;otsykB-_Gy!`Ez zvBT-wLFwm~ua|VIUEgy%_~h*u_ZOKwpY^>lkaO+#Wpn&i&K3<^ZBicS@ACA%Ps=S= zy~>a{%aCHd9Ky<-PXH430F5hd-%IbBzf;zxijvLdV57zb+&P3 zyY1Cv4qnNA*<(g0OYu#oYhR}{_x8#;@kO`DnvgN#z=px}nmCM?{9k1Pdd?j3E z{#vPWBbh08jod>w`j~Q*`*dl&+J2(sJ^$|?nzQ(%f9~kNndkEOo8rg$FXyFvzSA0K z8>apLY*_g>dP5JxE?85D~oOZ`8sLl_w6p*=g$|}9PVte`D1R7 z5>I>lN@~*6${1DQANK#&&CEZ(o2AaT?7-X=pDhn6KH6_E>+s&Ag?ExaZaMyF$MH{@ z{ZDTw_XaR5-(J#uQ6%@^^_%$t-i%Bl%(zPiVBr7;OBz8GzH$QHB=p=4F^7R+Nn;s? XNvL^0z?+o~q?!o`rvPaQ77z~r0NEO% literal 0 HcmV?d00001 diff --git a/5_mpi_module_using_env.zip b/5_mpi_module_using_env.zip new file mode 100644 index 0000000000000000000000000000000000000000..5df5fa50fa496d4d529a4233168c308a75792351 GIT binary patch literal 1132 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&d(bY#N_ikQtwwpHiBW8edwRnU@})npdU| z6-do1DXP>fs62f}_k_MypvF3#XOAA8@(J$fKkt3Ux3@oh!`9G%{{Hj6XU=r@hi`ur z#L(2V=*%7=-UUH>k1YCPN5oQGzL?4FT(K-LZ*9<)zC}Lf9W%2oR~w|*-ZA$wdr&3(&u~%xUZWn(R&jwZ zyBwcgeSCZQt>j)YwS|*8+#>SUKG)-GIA0>K^+J}LA-OPTV_2W?29_({sh;IF#~egg z?NkoBUVa+56lS*Ow>Pxf#55`TL=M<59!-a{j(;9_#jm?&@n4 z(muFZv+2^bwhPk?Cvz}vb^XG_bdU4+_NUeQmiKl&iTQr_ooM{V9>%Ua3vbIv9#mg; zP5H-#Z#ycq9&Ay36u5rH_JB^+$fL6rR;uofKXh_h%R#T*T0zQIqG3k0UGXxuHC10t zZ>PUK*2~MDZhojRe9Z;ZLqS_s_53?){Oa#x%eZ3~9y{92P2LuH@yD+XKmAvx-`*2) z;dOgcpPcBCbCYb=pD=c>J~&7Jl5F~_$G*IMy{4=VG0aOZ@8&qL%)b7{7Ln$Kw~Xuf ze-w1+mdEek5)`Xma`Ljd_I&|=J6rYpGfu55+U%t!VD|3u0b{x2em;<~S znM9az=T~5s1%oAxAd0x$i*6=*9)y_4z_6sT0gsueIWoYT6_|q=7?^-?1(06H4B`O* DOx)h3 literal 0 HcmV?d00001 diff --git a/6_hdi_module.zip b/6_hdi_module.zip new file mode 100644 index 0000000000000000000000000000000000000000..5faa60ead65f9d8fb53fe3bf80fdda1fe22da762 GIT binary patch literal 765 zcmWIWW@Zs#U|`^2SXo^ca6gUDX)z-MLk2SggA7pAEIuP8Gd?#zr8Fm1AHmeCOw7&c zopd_ywt;}__g`H<8KV34iZm@^?ODJ!>zG4VPS=4MlaxDk<0bmUUOm3=9q6aU&Us<# zika0XPFuUA=Qqpg$eL6du2sy_V(9M+a&hIgSZuN6g4f!n+b!EnyUb?AoG=Q%a6a$L;^$IFa zpV2*`uNA1VPUqR9N2h#(JNnOipYiSO58tpgG@!r#yziMa-TmR)9|bWqH7z=`M~HVp z(B319z8LxH=`jR&Gct)V<4#mS>%m}2BZ$J6#L!Jb_W{Hl28Jb#cY%o(#UwQU1bDNu QfmAaA;S?Yp%mm^A0IcdUH~;_u literal 0 HcmV?d00001 diff --git a/7.1_kfc_merge_files_add_aml_identifier.zip b/7.1_kfc_merge_files_add_aml_identifier.zip new file mode 100644 index 0000000000000000000000000000000000000000..267e90088c9c8ac2b981a7b0bef33f2460d11538 GIT binary patch literal 695 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&i?BY_4Y*pPiN*pPO2go*JK)nUh)^pO}&o zpO~8ypP7=HSCW~QnOdX|mewn%Jbgy@guYgw#yXv6j~<=!3GV1W?|sI%w?BNt*3f|d z{`0!0(7fh zCD3uD0VlH#8wl+Et^I78_u>=2ny&Hz93|FYgS;fYlie5aR)!Sp-#3Z3k*#XZ%1 zU)((zkYF8kY8CT`iz4p&FFX$#KkaPTr>QTHu%$2Ufra3F&1SP_7AF|BmoueFH#2E2 zd0{Ob^f0otn&b8C;Mwwvji+eOm>yE@AGo;M*)Bd{UuW&h2&VXeNqQl9p@_B zJ7xE-j?UF8R;+WlOE-Rqzj(d$;tjvHaa}s=EvBU!1yHuAVW#n~_O`8Fxej;~ET>G=eA+qaEFF k^vHu4&A_mvv6FbiVNn_2&B_KcfC&h90qN(!6v4m%0Qv<6)&Kwi literal 0 HcmV?d00001 diff --git a/7_kfc_merge_files.zip b/7_kfc_merge_files.zip new file mode 100644 index 0000000000000000000000000000000000000000..6feeb9b9f103e0e291f718cdf294cbbd475b8822 GIT binary patch literal 587 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 literal 0 HcmV?d00001 diff --git a/no_spec.zip b/no_spec.zip new file mode 100644 index 0000000000000000000000000000000000000000..82073e70af56c72b87d5111cda903ada3634c51a GIT binary patch literal 2075 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 KznftAv-=m;4)Nvy literal 0 HcmV?d00001 From 10cb398df933884731c8ce639ecfe86a999d7101 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 15:56:42 +0800 Subject: [PATCH 12/30] add testcase 0.1 --- 0.1_official_module_with_invoker.zip | Bin 0 -> 1922 bytes .../clean_missing_data.yaml | 133 ++++++++++++++++++ 0.1_official_module_with_invoker/invoker.py | 36 +++++ 3 files changed, 169 insertions(+) create mode 100644 0.1_official_module_with_invoker.zip create mode 100644 0.1_official_module_with_invoker/clean_missing_data.yaml create mode 100644 0.1_official_module_with_invoker/invoker.py diff --git a/0.1_official_module_with_invoker.zip b/0.1_official_module_with_invoker.zip new file mode 100644 index 0000000000000000000000000000000000000000..5061579aa4d67a7e3fc205e3c1d465f824778ac9 GIT binary patch literal 1922 zcmb7_X*3&%8iu2`S|@3(Cm2hwP)n&PA#G!+tu94J?3W-RiXc_gUQ6$35VhTEi)jQy ziWH$rqV@(wYGS8$wTp^U71zwY=broH&bc$+_v1a^_v88Vp7Xx;HoSZi007`DfF~i| zetPs~;!7R?z=szA&^Z0-XzO}m(P)e>1{vfPjP;8MLU~1E?gn^aLhfPjpu#WxTeU-@ zQyp#ZOz8k=N6w;qieP>8u&KDnGk0+tC3W@1T20eeJE_`gG_K4Ue9$SxENOx$MHm>2VN~|}L#>CVuI|mETmcuBS z-kEZ*_O3eaHK@&Om{Y&zfOqoZ`I9C(`?}T{a!PygX=5+fq)RKFUs-JRp*A0tKO{sF zc2~F9pSR`|8Wcx3Z|I<=^YWwy|1ai~C3ii`!BzJ$9^e?wJb2oaHDbJu0!p3KiUo`a zGNx<3qo9`OOdoD#64-V$JxXBvlBupM*>qLR(?QstRM=ag)JtZSJBb6yXI8CyZJYYKS$a*DMV1po3FSJfw-QNxS-YJ#avdJ$9}B|v zc})7#ai6U8qk=0WnmwfGCy6T}=@*CUobgX5FF)!vAD8^rFj#q?rktNUu=^3$_hMTy zRHraB45yxBXu2Wv<7^w|LEV~4rYu9N$<$3OQoYnkpj6ITqts#Irh3_7nW^RlPt|8D z$DHLXbt$r1{2BZIm@a&3I%5K_coUVg~CNbP83 zaL}fU4R#U=q#rr&jPyBD8}US7mf5-@Ucr&int8|A#ux8Se{1QnGP=E^G@dQl=((XF z6`&1b%o%)4M_YKclU}oefjh7Gmk#rjtE5xZRNG`njBSfx+^N(`<}Oumg>7FZQanUb zE%v@Oa^{J0#q@4ToHYN)cfvLQd6GEf*MWp1E0%OX9Qe+=XSfz;76WlALZF3O^*hIO}iC7 zOFWiJN&Hd%YSbPg=cvUk6!jpI^Pr5P$NNK%;zeaHH zZxszszwzNX>3zmfe=+kNJr^ng@f(aYcxX0e0p|%@ilZKG7!b|){&E9r-G83zV>(;% zc9H005y9Bb=byXH>CB!FjPm;!SliyCB)7i_X;-I^Qz8tFzJy1Cfi8)|JK+Is3Gfyh z_5}r|(mqHOG_~9Xd}{E=p8Zs%Gz}r?^P&}`KmTqxWi3{_H=hc(&D=4K8&9C zi!jv#&3u&(xJg%aA_Kfwxdg>g@^+78*xa8Y{>qel!IQ~h6+Cqr+>sovMCRMT3iuo~~`LcP=X?Yb*$tn*i8fWciy$BEStDiD`xBznz!_x^p#} zPMpGZ;jNBG+ok#+R2*XFgeLkoq>K)1W!G~fx>uLpqiEsWJXlloK8x*p%u*qs#_>D8 zb;=Q>p>0kGa?03GBW}Tm)t6Gm zx+AJez8+|R@w>OgGQbiq6qa0{zC493(pRu zJoK(zo4h<1ZmpD&&$*5h&tN4W-4sl&g^`{7JO{uMmBO9YP5IiPX0EdKKX-s78ZA|D zJB0{mY-J;>c|p~HX6}*iqDB{>cf1_3@O~3*hI5-{Ie}(VskuKF9BB`T_dXy)GF-|1 z$gSMou6M|#*np<$+Gln!FNN<#>=J5#FLW)P>;B;>>BX^+a=Mt@^MOcU2cb3E^qO&; z*-v9)hH@JPu;u34uEk<_V9DQx#fE%ui;vPT&^{A=E`_1wZACPmqJ=h7S0vVJ*R=oc z+RIg&H=lD?)(W;o!4n}MyH50*)Gr$j)6Clu2J~w+JeXo%%LUPLXh#pI$(6D#ew^N{ zp%`=rA64*gc%cz zn}pQT_Q9CeA)J@t1D4=cWcuD?8`#_MoRQ%D{kl30uiu80^sD@d^7?P^|BA$aVF3VA d66drX|1bD=0@B`wU*K2LnbU1O)vDjFe*$;`hd%%S literal 0 HcmV?d00001 diff --git a/0.1_official_module_with_invoker/clean_missing_data.yaml b/0.1_official_module_with_invoker/clean_missing_data.yaml new file mode 100644 index 0000000..1377d47 --- /dev/null +++ b/0.1_official_module_with_invoker/clean_missing_data.yaml @@ -0,0 +1,133 @@ +amlModuleIdentifier: + namespace: zhizhu.com/test + moduleName: New Clean Missing Data + moduleVersion: 0.0.116.1 +isDeterministic: true +category: Data Transformation +description: Specifies how to handle the values missing from a dataset. +releaseState: Release +inputs: +- name: Dataset + type: DataFrameDirectory + port: true + description: Dataset to be cleaned +- name: Columns to be cleaned + type: ColumnPicker + description: Columns for missing values clean operation + columnPickerFor: Dataset +- name: Minimum missing value ratio + type: Float + description: Clean only column with missing value ratio above specified value, out + of set of all selected columns + default: 0.0 + min: 0.0 + max: 1.0 +- name: Maximum missing value ratio + type: Float + default: 1.0 + description: Clean only columns with missing value ratio below specified value, + out of set of all selected columns + min: 0.0 + max: 1.0 +- name: Cleaning mode + type: Mode + default: Custom substitution value + description: Algorithm to clean missing values + options: + - Custom substitution value: + - name: Replacement value + type: String + default: '0' + optional: true + description: Type the value that takes the place of missing values + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mean: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with median: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mode: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Remove entire row + - Remove entire column +outputs: +- name: Cleaned dataset + type: DataFrameDirectory + description: Cleaned dataset +- name: Cleaning transformation + type: TransformationDirectory + description: Transformation to be passed to Apply Transformation module to clean + new data +implementation: + container: + runConfig: + baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + gpuSupport: false + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 + command: + - python + - invoker.py + - python + - -m + - azureml.studio.modulehost.module_invoker + - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + args: + - --dataset + - inputPath: Dataset + - --columns-to-be-cleaned + - inputValue: Columns to be cleaned + - --minimum-missing-value-ratio + - inputValue: Minimum missing value ratio + - --maximum-missing-value-ratio + - inputValue: Maximum missing value ratio + - --cleaning-mode + - inputValue: Cleaning mode + - - --replacement-value + - inputValue: Replacement value + - - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column + - --cleaned-dataset + - outputPath: Cleaned dataset + - --cleaning-transformation + - outputPath: Cleaning transformation + invoking: + module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + class: CleanMissingDataModule + func: run diff --git a/0.1_official_module_with_invoker/invoker.py b/0.1_official_module_with_invoker/invoker.py new file mode 100644 index 0000000..4eba60d --- /dev/null +++ b/0.1_official_module_with_invoker/invoker.py @@ -0,0 +1,36 @@ +import subprocess +import sys + + +def run(command: list, timeout=60000): + if not command: + return + + return subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr).wait(timeout=timeout) + + +INVOKER_VERSION = '0.0.6' + + +def is_invoking_official_module(args): + return len(args) >= 3 and args[0] == 'python' and args[1] == '-m' and args[2].startswith('azureml.studio.') + + +def generate_run_command(args): + return [arg for arg in args] + + +def execute(args): + is_custom_module = not is_invoking_official_module(args) + module_type = 'custom module' if is_custom_module else 'official module' + print('Invoking {} by invoker {}.'.format(module_type, INVOKER_VERSION)) + + ret = run(generate_run_command(args)) + + # set the subprocess run result as exit value + exit(ret) + + +if __name__ == '__main__': + args = sys.argv[1:] + execute(args) From 3f914f94069c70d52c2a7b14bac2c0d20d5b6526 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 16:14:38 +0800 Subject: [PATCH 13/30] add .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..044566d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.git.zip From fd5820727268793b2b15f4cdb6337c13ea8fff9f Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 16:17:31 +0800 Subject: [PATCH 14/30] add testcase 7.2 --- 7.2_kfc_merge_files_datatype_has_dicts.zip | Bin 0 -> 746 bytes .../kfc.yaml | 29 ++++++++++++++++++ .../merge.py | 6 ++++ 3 files changed, 35 insertions(+) create mode 100644 7.2_kfc_merge_files_datatype_has_dicts.zip create mode 100644 7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml create mode 100644 7.2_kfc_merge_files_datatype_has_dicts/merge.py diff --git a/7.2_kfc_merge_files_datatype_has_dicts.zip b/7.2_kfc_merge_files_datatype_has_dicts.zip new file mode 100644 index 0000000000000000000000000000000000000000..fbde25079b3fb39856dac314dcb883071d40ff2f GIT binary patch literal 746 zcmWIWW@Zs#U|`^2c-mMO;N9}@stu553&i?BY_4Y%pPiN*pPO2go*JK)nUh)^pORRT zSW;P#8lRB}8!&JJbQj?yJ)g_C0qMyrrIwMc=7s*cV_dRX>VI=H(q1Av;O_Mxh%8z zUj#~d8ZUNST&^1#Hg}N%7sKOQD_)B7a#k$7Abg?m5Q~`A(oB{z+m8;6DYx@x?>e|; zGMn4eH4VGgoc3L~rr)M3iMPyd^XadXFYC6NoSD4bhvmZ?l~?6Y5;Ym;sCUP`b+?>w z@Gs-mtckG}4?k=5$V_?LuiJk{MCj|)@@wj=R_)oj&nkHKn*{yXEj5e$ie~(Z^zxQ< zJIfR{dsm!jB!jyA3f6*-kR2!L=k7V%`+w`Ap6e+=E;F`1t$i7^P)D|3v$=MgmUHG5 zp1cy->6d15)h8(|Ud`q%q_y+fvDLe)K1bwT-{`5|IlFz+zWM!2Dx0^7et4-aH)n5b zT==h-*~bjOJa*dNW_kbS8`mw8F?HJ(h`+abU$>x7{NW#_0B=Sn5oX+J1DHI(U`Zp0 pA~B^P8;&i$Ax1MWENSc{-f&p#2Y9oxfec^*!d*aG3Ydr(7yx}YA~^s6 literal 0 HcmV?d00001 diff --git a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml new file mode 100644 index 0000000..b861c7b --- /dev/null +++ b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml @@ -0,0 +1,29 @@ +amlIdentifier: + moduleName: Merge every n files together cdd3b0ba + version: 0.0.1 +inputs: +- name: InputFolder + type: + LocalPath: + openapi_schema_validator: + type: string + pattern: "^file://.*$" +- name: merge_count + type: Integer + default: '100' + optional: true +outputs: +- name: OutputFolder + type: + LocalPath: + openapi_schema_validator: + type: string + pattern: "^file://.*$" +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/7.2_kfc_merge_files_datatype_has_dicts/merge.py b/7.2_kfc_merge_files_datatype_has_dicts/merge.py new file mode 100644 index 0000000..eaf3db2 --- /dev/null +++ b/7.2_kfc_merge_files_datatype_has_dicts/merge.py @@ -0,0 +1,6 @@ +import sys + + +if __name__ == '__main__': + print(sys.argv) + From fc7b528e8fde83ad811aacccb8a6251ab439b617 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:04:54 +0800 Subject: [PATCH 15/30] rename amlModuleIdentifier to moduleIdentifier --- 0.1_official_module_with_invoker.zip | Bin 1922 -> 3233 bytes .../clean_missing_data.yaml | 2 +- .../clean_missing_data.yaml-- | 133 ++++++++++ 0_official_module.zip | Bin 1855 -> 3130 bytes 0_official_module/clean_missing_data.yaml | 2 +- 0_official_module/clean_missing_data.yaml-- | 131 ++++++++++ 10_invalid_yaml.zip | Bin 2126 -> 4064 bytes 10_invalid_yaml/invalid.yaml-- | 1 + 10_invalid_yaml/invalid2.yaml-- | 1 + 10_invalid_yaml/invalid3.yaml-- | 1 + 10_invalid_yaml/invalid4.yaml-- | 6 + 10_invalid_yaml/module_spec.yaml | 2 +- 10_invalid_yaml/module_spec.yaml-- | 234 ++++++++++++++++++ 1_basic_kfc.zip | Bin 1003 -> 1438 bytes 1_basic_kfc/kubeflow.yaml-- | 19 ++ 2.2_eselect_fix_port_type.zip | Bin 511 -> 1001 bytes 2.2_eselect_fix_port_type/eselect.yaml | 2 +- 2.2_eselect_fix_port_type/eselect.yaml-- | 25 ++ 2.3_eselect_commands_with_placeholders.zip | Bin 592 -> 1160 bytes .../module_spec.yaml | 2 +- .../module_spec.yaml-- | 17 ++ 2_eselect.zip | Bin 455 -> 889 bytes 2_eselect/eselect.yaml | 2 +- 2_eselect/eselect.yaml-- | 24 ++ 3_basic_module.zip | Bin 862 -> 1509 bytes 3_basic_module/basic_module.yaml | 2 +- 3_basic_module/basic_module.yaml-- | 35 +++ 4_mpi_module.zip | Bin 1218 -> 2225 bytes 4_mpi_module/mpi_module.yaml | 2 +- 4_mpi_module/mpi_module.yaml-- | 71 ++++++ 5_mpi_module_using_env.zip | Bin 1132 -> 2033 bytes 5_mpi_module_using_env/mpi_module.yaml | 2 +- 5_mpi_module_using_env/mpi_module.yaml-- | 62 +++++ 6_hdi_module.zip | Bin 765 -> 1318 bytes 6_hdi_module/hdi_module.yaml | 2 +- 6_hdi_module/hdi_module.yaml-- | 34 +++ 7.1_kfc_merge_files_add_aml_identifier.zip | Bin 695 -> 1142 bytes .../kfc.yaml-- | 21 ++ 7.2_kfc_merge_files_datatype_has_dicts.zip | Bin 746 -> 1244 bytes .../kfc.yaml-- | 29 +++ 7_kfc_merge_files.zip | Bin 587 -> 968 bytes 7_kfc_merge_files/kfc.yaml-- | 19 ++ 8_merge_files.zip | Bin 709 -> 1218 bytes 8_merge_files/module_spec.yaml | 2 +- 8_merge_files/module_spec.yaml-- | 27 ++ 9_smart_reply_pytorch.zip | Bin 1773 -> 3078 bytes 9_smart_reply_pytorch/module_spec.yaml | 2 +- 9_smart_reply_pytorch/module_spec.yaml-- | 234 ++++++++++++++++++ multiple_specs.zip | Bin 4117 -> 6125 bytes multiple_specs/add_rows.yaml-- | 49 ++++ multiple_specs/clean_missing_data.yaml-- | 130 ++++++++++ multiple_specs_subfolder.zip | Bin 4298 -> 6359 bytes multiple_specs_subfolder/add_rows.yaml-- | 49 ++++ .../spec/clean_missing_data.yaml-- | 130 ++++++++++ one_spec.zip | Bin 3336 -> 4595 bytes one_spec/clean_missing_data.yaml-- | 130 ++++++++++ 56 files changed, 1624 insertions(+), 12 deletions(-) create mode 100644 0.1_official_module_with_invoker/clean_missing_data.yaml-- create mode 100644 0_official_module/clean_missing_data.yaml-- create mode 100644 10_invalid_yaml/invalid.yaml-- create mode 100644 10_invalid_yaml/invalid2.yaml-- create mode 100644 10_invalid_yaml/invalid3.yaml-- create mode 100644 10_invalid_yaml/invalid4.yaml-- create mode 100644 10_invalid_yaml/module_spec.yaml-- create mode 100644 1_basic_kfc/kubeflow.yaml-- create mode 100644 2.2_eselect_fix_port_type/eselect.yaml-- create mode 100644 2.3_eselect_commands_with_placeholders/module_spec.yaml-- create mode 100644 2_eselect/eselect.yaml-- create mode 100644 3_basic_module/basic_module.yaml-- create mode 100644 4_mpi_module/mpi_module.yaml-- create mode 100644 5_mpi_module_using_env/mpi_module.yaml-- create mode 100644 6_hdi_module/hdi_module.yaml-- create mode 100644 7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- create mode 100644 7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml-- create mode 100644 7_kfc_merge_files/kfc.yaml-- create mode 100644 8_merge_files/module_spec.yaml-- create mode 100644 9_smart_reply_pytorch/module_spec.yaml-- create mode 100644 multiple_specs/add_rows.yaml-- create mode 100644 multiple_specs/clean_missing_data.yaml-- create mode 100644 multiple_specs_subfolder/add_rows.yaml-- create mode 100644 multiple_specs_subfolder/spec/clean_missing_data.yaml-- create mode 100644 one_spec/clean_missing_data.yaml-- diff --git a/0.1_official_module_with_invoker.zip b/0.1_official_module_with_invoker.zip index 5061579aa4d67a7e3fc205e3c1d465f824778ac9..2c9945335dd0348bb1c32137790223e466d7a033 100644 GIT binary patch delta 1260 zcmV@6aWAK2mlIyeo)EUiy>kJ001%&0026Z5CS^_EiJQ40%QcS z0{sCEm56>&nu0LVUjzUEFOv)cKmk{iO#(cBpQUbtfR8OG&$k?Gy&yy}3C^$vYVzFi z=Pp!@majcHkB2f{_=F}k`2>5i7Qhs_<<4=nBiGEc!RQNE$F-`-vRYQF)!S;d;O-hc zSjiQ4o;Nk|Ho&4`9(LLu>U5ucwoJLLwvu_gzG%TUmK&d-9t<>*s3V=;6R%0fR4agg z_zuVu69Ero;j*<_5=L5tbl|In1*GcW!K1gD+~?JTD-*n{7c_;P8K5}^;SZ*)Z!8{N za|?|}mUv{e^@TejBYx$2WVQj)#NUrE^{$-G3B$Dob4{UCPX8w#u_NBz3I3auPyEz=fHu?#OEAOk# zXTK30A}AqxOJbhz9}@x}1tu4*GO9~{w=4*sswb8dSHmOwR+AMz4&ktGKM_uWT_vo` z(Ycqy+kn6VoQ9V}3;z4zU5Y31hz_xjV2I#0FNOft!FjB37dF^RKEx0*i)mPY?*%p& z#vx?`&aOFnKU-!Z{wu^bux2`Y94Ox_?@EytOIt(4!#i1!DrV~XYo z4REZl{=})kA+LSMn~qq$$49V#ryWlFY?X?_{c$p}!ArHpf|-eFQU;@}-h;$uo1^># zuqUrR6S}k7upI_8?402L4^rFmU&;Nil8gEImD+zVwUHi)+6zz6W@fk0!Eee~r>rwh zFK;gEmGiIM$<4E`jvwo<9(gRwUW6Z;6{%yGbLbKm?~TFF>%=JQ#o_aRloG8_TtX|$~OnR95Y{tMIc24s)keE=CS3=R?bNmECmO`SSQ!aQb_N z2#q+l$l+km+%eyOoyz)bScDk$nr?s| zn{v4JCFz|P6?=&*>u6e7(KJhFFFdDMmsNK`%u@D85ibhg5@~5`D*FLEiEtt|(=EJb zkLr$|s=M*+c@0SW96K6kIK>%0j>ye|eRt?*++CTulOzozoQ_8L*u~F`{~>$OP6{he z<6K$igLsnnvvE2`i!eKQQy<|;F7Vtc^?dvN^A1YWqOd5x<72nnCfH=L4GMp%&nu0LVUjzUEFAx9#H~;_u0000000000q=BynlMw@19SAAW;$y?ouNh}Nu fMgj~B77Pfmr12{wP?HlM69W^&exUeTHjpF$GY=GL diff --git a/0.1_official_module_with_invoker/clean_missing_data.yaml b/0.1_official_module_with_invoker/clean_missing_data.yaml index 1377d47..26f145a 100644 --- a/0.1_official_module_with_invoker/clean_missing_data.yaml +++ b/0.1_official_module_with_invoker/clean_missing_data.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: zhizhu.com/test moduleName: New Clean Missing Data moduleVersion: 0.0.116.1 diff --git a/0.1_official_module_with_invoker/clean_missing_data.yaml-- b/0.1_official_module_with_invoker/clean_missing_data.yaml-- new file mode 100644 index 0000000..1377d47 --- /dev/null +++ b/0.1_official_module_with_invoker/clean_missing_data.yaml-- @@ -0,0 +1,133 @@ +amlModuleIdentifier: + namespace: zhizhu.com/test + moduleName: New Clean Missing Data + moduleVersion: 0.0.116.1 +isDeterministic: true +category: Data Transformation +description: Specifies how to handle the values missing from a dataset. +releaseState: Release +inputs: +- name: Dataset + type: DataFrameDirectory + port: true + description: Dataset to be cleaned +- name: Columns to be cleaned + type: ColumnPicker + description: Columns for missing values clean operation + columnPickerFor: Dataset +- name: Minimum missing value ratio + type: Float + description: Clean only column with missing value ratio above specified value, out + of set of all selected columns + default: 0.0 + min: 0.0 + max: 1.0 +- name: Maximum missing value ratio + type: Float + default: 1.0 + description: Clean only columns with missing value ratio below specified value, + out of set of all selected columns + min: 0.0 + max: 1.0 +- name: Cleaning mode + type: Mode + default: Custom substitution value + description: Algorithm to clean missing values + options: + - Custom substitution value: + - name: Replacement value + type: String + default: '0' + optional: true + description: Type the value that takes the place of missing values + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mean: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with median: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mode: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Remove entire row + - Remove entire column +outputs: +- name: Cleaned dataset + type: DataFrameDirectory + description: Cleaned dataset +- name: Cleaning transformation + type: TransformationDirectory + description: Transformation to be passed to Apply Transformation module to clean + new data +implementation: + container: + runConfig: + baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + gpuSupport: false + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 + command: + - python + - invoker.py + - python + - -m + - azureml.studio.modulehost.module_invoker + - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + args: + - --dataset + - inputPath: Dataset + - --columns-to-be-cleaned + - inputValue: Columns to be cleaned + - --minimum-missing-value-ratio + - inputValue: Minimum missing value ratio + - --maximum-missing-value-ratio + - inputValue: Maximum missing value ratio + - --cleaning-mode + - inputValue: Cleaning mode + - - --replacement-value + - inputValue: Replacement value + - - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column + - --cleaned-dataset + - outputPath: Cleaned dataset + - --cleaning-transformation + - outputPath: Cleaning transformation + invoking: + module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + class: CleanMissingDataModule + func: run diff --git a/0_official_module.zip b/0_official_module.zip index 184621f8d8d164fa0b87c633c453ac1ae09ff213..9005340ae8cc1b3facacff8c0876e5181304dd8b 100644 GIT binary patch delta 1239 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 D`aZ#l delta 191 zcmaDLe@vLad;*g*d3h$=^9%6HFd)E^M!m@od9^2(@(N7O;p1a0 z1oEUNuj6H#Je!Ya@+}?#ep!TKh9!+J!1B8MLX(#RO`Ofo$7I1aIi6nsL0z{JqQz`)?i3?vu;A}k4= diff --git a/1_basic_kfc/kubeflow.yaml-- b/1_basic_kfc/kubeflow.yaml-- new file mode 100644 index 0000000..51a979e --- /dev/null +++ b/1_basic_kfc/kubeflow.yaml-- @@ -0,0 +1,19 @@ +name: xgboost4j - Train classifier +description: Trains a boosted tree ensemble classifier using xgboost4j + +inputs: +- {name: Training data} +- {name: Rounds, type: Integer, default: '30', help: Number of training rounds} + +outputs: +- {name: Trained model, type: XGBoost model, help: Trained XGBoost model} + +implementation: + container: + image: gcr.io/ml-pipeline/xgboost-classifier-train@sha256:b3a64d57 + command: [ + /ml/train.py, + --train-set, {inputPath: Training data}, + --rounds, {inputValue: Rounds}, + --out-model, {outputPath: Trained model}, + ] diff --git a/2.2_eselect_fix_port_type.zip b/2.2_eselect_fix_port_type.zip index 5a5432e08a4a54f88a87ef9530eaeafed815d280..94d842359dc272148fb26c60e90ba3c7f1c039c4 100644 GIT binary patch delta 460 zcmey*{E}Tdz?+#xgn@y9gJEh%UBKEu&3%513=FfG7#P$hA7Ip+=ptIbcS_TS>6Z?# zag((&mP|`pnSb9xYuDG5N%|-M)az_rd~my%>}$W|6`yzxXm(#*&8B@IK6UTGMT*h4 zjvSjAQFp&pSY^?{w(nm=ov%F6+95Lik>>fR9^VV|g4g*Kw6vYch;7lE!20&ji3^#{ z1;K*R3hXuyxDF;ZELeHzrGR8lSwy|V+O=j{48kTx&m4D({c8C4k;T08x}v9u$*F_9 ziBnWv=PlhEXfi)|=dC!??1v}47d=}LyPtVwvcCQ9m#*xBE{Ug%rGDPuqgs4?f0x%y zo84JQOQ+_{{e%BXR^la6ciu}j1Kb=1o zd?;A0tEYSP>_(g4%oC&-H9*10q^rBpC6(!nVm;LXe;!oa}5!7#O>F2L@IdVUon1H(5a1_tvQ1W$He&}i39oS+su@%A!Jy@F2v>4$ZWd3}&r5>tF7FZ_{v$7W$)Lq)%P zrr&oodO4Zg5(>7t{a@tVUA|4*^Y%>MvA=YAhWcTSuHQjziEcJ)%{`ns?2PKSD!pa@ zclb}wzr`ng{=8G_s`{0x?Y+QApW8gnOR{Lr>6aO+%NCtIQ>$W?zc)4F>%B`}yUqW5ZRA=U@#Reizy6VXv$sTvtTi zU-`#i@70%jM%c`K&cUDi?5ip@yYzukGm%-G(GnOBOuD)oLwgu`QQ~OwJ4Qb(MkWzv zNc^p=t_zr?Z*;2x7=J&3@n;E)RTx;(c%E@GBa@|su5N%gD;r3d2?);s>1E6y9so5Y B)cF7a delta 48 xcmeC+yudQ~Jfjq&`Q(etR-4tBdKf2*vj|K+#Oy7?%EkZ$j6j$Qq^~l9cmO=X3E=<$ diff --git a/2.3_eselect_commands_with_placeholders/module_spec.yaml b/2.3_eselect_commands_with_placeholders/module_spec.yaml index 7164159..7b10212 100644 --- a/2.3_eselect_commands_with_placeholders/module_spec.yaml +++ b/2.3_eselect_commands_with_placeholders/module_spec.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: example.com/modules moduleName: eselect moduleVersion: 0.0.1 diff --git a/2.3_eselect_commands_with_placeholders/module_spec.yaml-- b/2.3_eselect_commands_with_placeholders/module_spec.yaml-- new file mode 100644 index 0000000..7164159 --- /dev/null +++ b/2.3_eselect_commands_with_placeholders/module_spec.yaml-- @@ -0,0 +1,17 @@ +amlModuleIdentifier: + namespace: example.com/modules + moduleName: eselect + moduleVersion: 0.0.1 +description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. +inputs: + - {name: columns, type: String, description: 'column name list with ; as delimeter'} + - {name: input, type: AnyFile, description: 'the input file path, only TSV supported'} +outputs: + - {name: output, type: AnyFile, description: 'the output file path'} +implementation: + container: + image: ttthree/modules:latest + command: [ + python, /home/invoker.py, dotnet, /home/etools/eselect.dll, -f, {inputValue: columns}, {inputPath: input}, {outputPath: output} + ] + diff --git a/2_eselect.zip b/2_eselect.zip index 8bf92427b1bcafb7984a7b459e021d557fc41cd1..c3372c3ba66426b628d3d90b1f4e527d3f611cb6 100644 GIT binary patch delta 423 zcmX@k{F6;Qz?+#xgn@y9gJEh%UBK3jFS5)S85oKuip$q;%xf{=xjXR(d;i)i&96^g zTN*Td)g{mEA+kkB9IhO3>s)!{{&jJSgIjaz-rv-JFL=XG?!L~X9p@5rPBAH@e7MV! z!ysIhliGYEY-vcq$mLq}D%9AGhe zpw)DjacbJKVnfaf_lWv~Ct08SvLt4FJ=3hnU3=u?M@~Jf_3j?>tGBg1Xfjyo87g+u zJadurve~y+uZv8P6SeRxxsuvC@OgtOo?FXKw#JAq*k_eJ zW5>Dc=UFemUev)OxG`>*Z?Acir&;7_#f(R6cE=;xmZ`5`=ZmoZ^)SEZs+mQ7Zj$it zEt@SGQWdAzZpv9~@H=Gv|81M@y*F*ovw!M$?wJ2~)_WJ_-P&TS&GRxd74v(i9@U>9 z#V9dRT9QduccY0bBQHv*PHtn=ot)1oB_II|aTr+An8i3zMnXbYH^7^f4J670gk3=T ICKHGU0D*YcdN={>r2!!pg<~1dKrF0;F>pK|BByh6tGe diff --git a/2_eselect/eselect.yaml b/2_eselect/eselect.yaml index dafc3bf..1cb776d 100644 --- a/2_eselect/eselect.yaml +++ b/2_eselect/eselect.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: moduleName: eselect moduleVersion: 0.0.1 description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. diff --git a/2_eselect/eselect.yaml-- b/2_eselect/eselect.yaml-- new file mode 100644 index 0000000..dafc3bf --- /dev/null +++ b/2_eselect/eselect.yaml-- @@ -0,0 +1,24 @@ +amlModuleIdentifier: + moduleName: eselect + moduleVersion: 0.0.1 +description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. +inputs: +- name: columns + type: String +- name: input + type: String +outputs: +- name: output + type: AnyFile +implementation: + container: + image: ttthree/modules:latest + command: [python, /home/invoker.py] + args: + - dotnet + - /home/etools/eselect.dll + - -f + - inputValue: columns + - inputPath: input + - outputPath: output + diff --git a/3_basic_module.zip b/3_basic_module.zip index 09c79ecc178bc30afc39578f1412460c84e24c9e..3375019ded7c84647302f9b439bbebad8dc06d52 100644 GIT binary patch delta 620 zcmV-y0+apT2IUKof(@03eo!AxLQeMq008EZk12m$Z`3dle9y1gx4zuvK0pXr2mv}F zokUBeqQ0Pt?m2rGgTG|2DdFS4*LJQ|4i$-~II}a!cxH|3lBR7(mepQS5DkDuL(!uo z0rUfn*VIa97N$~TCXA;Ekqdhl zpd)|d+B~>$aLa?ITZo=yanymb^##y&aHq7+&cJ`oyt6@_eHLNp@kFC@!%~ zIA3@*kz8?5_E3Riw4(UZ?n&i(qTE`h1BFxRs&R?`_WH3x|6x{@eJg2TU6T zZo*iV03$~jujhQ1dF@~Zzv}Z6xu2E*e`b$F{}9)FmFZCV*QnEJ2Tv>3|5mK0 ziZSIv9#5m6Nzf1Eo8}%+O9KQH005H%0}}xvlO+Qq0xd1Ewon2Mm56>&A5B6|_W=L^ z=93cxH$27T{Rba9&tBD9J8v_t90pTnly^aaQ0|0R-3poG) diff --git a/3_basic_module/basic_module.yaml b/3_basic_module/basic_module.yaml index 4d2c3cd..799c73d 100644 --- a/3_basic_module/basic_module.yaml +++ b/3_basic_module/basic_module.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: example.com/modules moduleName: Basic Module moduleVersion: 0.0.2 diff --git a/3_basic_module/basic_module.yaml-- b/3_basic_module/basic_module.yaml-- new file mode 100644 index 0000000..4d2c3cd --- /dev/null +++ b/3_basic_module/basic_module.yaml-- @@ -0,0 +1,35 @@ +amlModuleIdentifier: + namespace: example.com/modules + moduleName: Basic Module + moduleVersion: 0.0.2 +description: | + Basic module for demo. + No `type` specified in spec and will defaults to 'Basic'. + Demos how to specify an environment from a pre-built docker image. +metadata: + properties: + tags: [nlp, bert] + contact: AzureML Studio Team + helpDocument: http://readthedocs.com/proj +inputs: + - name: Input Port + type: DataFrameDirectory + - name: Parameter 1 + type: String + default: hello + - name: Parameter 2 + type: Integer + default: 1 +outputs: + - name: Output Port + type: DataFrameDirectory +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --output, { outputPath: Output Port }, + ] diff --git a/4_mpi_module.zip b/4_mpi_module.zip index 7e3bf75641d7562922e2fbbc969178e811f2bf5c..d4d6305883d26bf5a123ad0cdc163e206ed3983d 100644 GIT binary patch delta 936 zcmV;Z16TaQ39%87kO3Z%ksksrEwQj_0~G@V6aWAK2mqCceoz_dIL&7R006g1K(P*;VH`{71h?Ah+811RQ(f1BH-g%NNOzjp^; z&^n=23A18W%rn0+371vqxE037!=Ho?&dCRAZ6Sm&$b6-NTVx)ADY#g#225ZGFX0kB z+=QSv;5EFU7%z%+@+pR9vIJIDaASXab*5Dm%dGYEX$K=bl2`$~Ci z(84rS62UM_rS(+B!QpRxA8yb)A^^r>Zm|)L09XO4J7KlzsEr|1xZSl+!77vm$Dh<}T`qsQjCWP`k(_kIE~DYObk%iC|RD z*K^|kXDG?Ju*ki(n+dEs);xcFUyov}x7CCBD9EL^LN(D)Va=#FWne1xU>XTCkzmkR zL{CmYGvO#(aWu(dl;nfzyZscOv5E#AV~1*!WdeUuXf=U9WRKU637oZBQ>!<+w@|Y? zZ3RsN*HYW#6qX|jgOv7Jq(XEejAVLcKgc?JocfC7vsL3xhJ&(O=BR%vmZ=8ej!98P z{T7+-{b3(JMblv;ANMiajcD9HB>pqqlWd;5(5r_F%?~a_%Hq_o7-x<4BgK3++#(Yl zO=?hVyi;(9V<1%8ivT404-b=;Y!pHB?^{H8ZkfZVOxmB^7W+Gtg?Z}aG=NG$JY;9Y zVm5zWEc5=B==SrIV)lP(2xd0EO-#~5d@6R1%Alf^&38kbo>cZQRaDq-qn$9q@Rlis za?dZcY$$^pnJYY=CcqQ1(`9i|ygob z7e;fqw>XY_ES~mQ9QRm0?Xettq!9|>^p&8Ru^Zp(GEd&ip29D~fB;Jx%O*~g7Yp!aWdjK^0pS!NEx`if0RZTG B3)lbv diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index cbd5417..0076069 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: microsoft.com/office/demo moduleName: Mpi Module moduleVersion: 0.0.1 diff --git a/4_mpi_module/mpi_module.yaml-- b/4_mpi_module/mpi_module.yaml-- new file mode 100644 index 0000000..cbd5417 --- /dev/null +++ b/4_mpi_module/mpi_module.yaml-- @@ -0,0 +1,71 @@ +amlModuleIdentifier: + namespace: microsoft.com/office/demo + moduleName: Mpi Module + moduleVersion: 0.0.1 +type: Mpi +description: | + Mpi module for demo. + To create an MPI module: + * Set `type` to 'Mpi'. + * Optional: add `runConfig` to specify the specification of run-level configurations. + This module also demos: + * Input port which supports multiple data types. + * Specification of Integer / Mode parameters. + * How to use a pre-registered environment of the worksapace. +metadata: + properties: + tags: [nlp, bert] + contact: AzureML Studio Team + helpDocument: http://readthedocs.com/proj +inputs: + - name: Input Port + type: [DataFrameDirectory, ImageDirectory] + - name: Parameter 1 + type: String + default: hello + description: Input a greeting message. + - name: Parameter 2 + type: Enum + default: Red + options: [Red, Green, Blue] + description: Choose your favorite color. + - name: Parameter 3 + type: Integer + default: 1 + min: 0 + max: 10 + description: The Integer parameter which has a range validation. +outputs: + - name: Output Port + type: DataFrameDirectory +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + max: 10 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + amlEnvironment: + docker: + baseImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + python: + condaDenpendencies: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.116 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --parameter-3, { inputValue: Parameter 3 }, + --output, { outputPath: Output Port }, + ] diff --git a/5_mpi_module_using_env.zip b/5_mpi_module_using_env.zip index 5df5fa50fa496d4d529a4233168c308a75792351..6a56b4c3c069baecd30d21180fc12c3e0b9cce5c 100644 GIT binary patch delta 893 zcmV-@1A_eQ2=Nb)ngJ-2Ed(h7EiJLc>;f4B1QY-O00;n;h<;Fnp<_Df0ssJv1^@si zlPv@(e}z;{Z`&{oz57@2R$xe+Cf&&xhHXu^1z6f(EqW<}Rg-C3n=J~GoG$zL@1tZV zP0|!S#i96~9?3^Fl(#j`a@1ZG3T>7EXwjfELShDul9n75K9$srs3?@gQH~99S`(p{ zoSebjD456p+k;!QPLa;wG(AnniC>#8FUiqKf2)j-hkrRgfIAEnWFgR}9KIot7KKL; z8s>{xpA!_qE4W4v_kr{tJi!TboTS~!RiqYm1|rYl-nROjbfL-TGfY0<0Drg-G0Aq1zu~d!|FbC8tWl1+Y#y}OS zdm#JMi7>`AVIC0#1i8kNLF*NE;=zm3WpJl!Gl1`Wu#8b|fEUtd@cwseasCCaeVZ$S z8x#$^abAk1b}{72cY7{*8}Sv^W=gURe~L1wyf@is#M8`KT29hMKe3b_i3+`oT87bi zS>MeC_pcKeopU#3{U1Y1rplu9WY+_jHKKg{zue(iY`O>I9g=Hrl`dl-$3pOIvY@o4 zKD1-ZPK1EcB6mZ<$v395>(s0}69^mkvF8~M<9-a_PyAg7U+pdk{2Oc&x04!JRzPbu_tg%U6CjS9YO928D0~7!N00;o7dwx($lfMIB0VtCn z1UD`%El^7V0u%!j000080F{V-P=ujlI_Uxc0E`9z044wc00000000000HlGi1CuTU TFb)F%0|5R2007+v00000#j}t3 delta 49 xcmey!|Au42EJn4-G3=TfkG)} + helpDocument: http://readthedocs.com/proj +inputs: + - name: Input Port + type: [DataFrameDirectory, ImageDirectory] + - name: Parameter 1 + type: String + default: hello + description: Input a greeting message. + - name: Parameter 2 + type: Enum + default: Red + options: [Red, Green, Blue] + description: Choose your favorite color. + - name: Parameter 3 + type: Integer + default: 1 + min: 0 + max: 10 + description: The Integer parameter which has a range validation. +outputs: + - name: Output Port + type: DataFrameDirectory +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + max: 10 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + amlEnvironment: + name: DemoEnv + version: 0.0.1 + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --parameter-3, { inputValue: Parameter 3 }, + --output, { outputPath: Output Port }, + ] diff --git a/6_hdi_module.zip b/6_hdi_module.zip index 5faa60ead65f9d8fb53fe3bf80fdda1fe22da762..982685be71aac9bbb2caa63399e307a6f39ff142 100644 GIT binary patch delta 570 zcmey%x{OOYz?+#xgn@y9gJEh%T|m&5*=`FN85mNT85m?H*D=XYv=XRSXV-e$rONm`U z3mMWyT1Bk#LJMYJD0O@2wwT-X*{ZL_g4{oL*#AiR)%b8**!ZQ-tyZIqeN&Gm zuU+*ZQcLW^!*sPhe_6iI*~B)`%5zKnkjxhy{3HY7x~2AZZUPKO@3=EmCfqv zEEtZR+!t}4KUMBw=O+E8V8w5bWtJBdUwUn{(c+W9pI0_-gKy3{X4d!lkIL1R*GfHi zubUG7VRc>qq;}P`ADgShj;SlW&YkFd)!t*azUKaSA~*KFy`d{>eB9G!{WBZxDgKX+ zKhvLlm$70ZlLVt2D3X|TbvIfqWfW&*5@E&?my>gtq8V>bKEb4@g;24wx-Q^;8lTf* pU~FdqV_OcG24G-GV<6MydL}suUEKh0RyL3@GY~!i(grLb9ssNf@45g0 delta 114 zcmZ3+^_Nv9z?+#xgn@y9gJETLUBLY`KBvWu3=A2}3=A?1lRvP?O|%l&JeO%IBNH>r w + helpDocument: http://readthedocs.com/proj +inputs: + - name: Input Port + type: DataFrameDirectory + - name: Parameter 1 + type: String + default: hello + - name: Parameter 2 + type: Integer + default: 1 +outputs: + - name: Output Port + type: DataFrameDirectory +implementation: + container: + image: office/module_runner_docker + command: [python, module_entry.py] + args: [ + --input, {inputPath: Input Port }, + --parameter-1, { inputValue: Parameter 1 }, + --parameter-2, { inputValue: Parameter 2 }, + --output, { outputPath: Output Port }, + ] diff --git a/7.1_kfc_merge_files_add_aml_identifier.zip b/7.1_kfc_merge_files_add_aml_identifier.zip index 267e90088c9c8ac2b981a7b0bef33f2460d11538..5fb9efb7ddc5a39b4e96b167dfa32a9ceae84669 100644 GIT binary patch delta 106 zcmdna`i*14Vn)Ns`AkMky1E;$2{UprvxqP-FmNzT?btZ=G$T+hk;y?%S2w_$kx7IZ rCRG=(lXux)K}H6KdqAuY)BpoZ8ecL_E?~0cV`gAxkOWG)GlQf6U7Xt&sb4DP+008WR3331c diff --git a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- new file mode 100644 index 0000000..53d831c --- /dev/null +++ b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- @@ -0,0 +1,21 @@ +amlIdentifier: + moduleName: Merge every n files together cdd3b0ba + version: 0.0.1 +inputs: +- name: InputFolder + type: LocalPath +- name: merge_count + type: Integer + default: '100' + optional: true +outputs: +- name: OutputFolder + type: LocalPath +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/7.2_kfc_merge_files_datatype_has_dicts.zip b/7.2_kfc_merge_files_datatype_has_dicts.zip index fbde25079b3fb39856dac314dcb883071d40ff2f..74c0f4e6d98f4cf88ee40c89f9d5d6f0f5306797 100644 GIT binary patch delta 118 zcmaFGdWUnuVn)M>(pnSGaWLuXZoKBk$i>Ve!oa}5!7#OBIQf- zGKnz5r0N3NcTC`OVPs(FU}9j<2Wo(UC5~7E9~c?+C#$nKhy{4FvM~Sw6AHNEZUMF3U;+{h02d$>T>t<8 delta 42 rcmX@Xewt-M-{ymi)r^zdnE57qG0TYsc(bxG009#aP5{zN89_V%2OJ2@ diff --git a/7_kfc_merge_files/kfc.yaml-- b/7_kfc_merge_files/kfc.yaml-- new file mode 100644 index 0000000..9c3add3 --- /dev/null +++ b/7_kfc_merge_files/kfc.yaml-- @@ -0,0 +1,19 @@ +name: Merge every n files together cdd3b0ba +inputs: +- name: InputFolder + type: LocalPath +- name: merge_count + type: Integer + default: '100' + optional: true +outputs: +- name: OutputFolder + type: LocalPath +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/8_merge_files.zip b/8_merge_files.zip index 3c810c5864e63b97b0b9e31f248ab4ac32ad3873..6082bc9383d24a76bd8db6dc429d7128d6ca6f30 100644 GIT binary patch delta 375 zcmX@gdWdsEmEhElx`2&~KCdlgWMJrLVqlP)+{dIiagDfl#`YHrr@ICQ2)*UFz-<(I z;O{T5qKQexH2@c0Q8>Lj>04 z*6La?#%r8q`7(R50HZg{_B#hZPmX64RhjqiiOc*wUfC&^o>WM5x2FZ!|DRp~`#$6USF?ODkhrn@?T>+$yaj1uj|p(}&_ z|H_VtoV$1WjtK^?8%i(Q@I2mF|7Md;-lre?9MlmqRCIN#?0VoOsOB!XFCigQbNa*SYc(byBgqeZx9*{oA H4B`O*LTH>f delta 53 zcmX@ad6acR)ns)h0YE diff --git a/8_merge_files/module_spec.yaml b/8_merge_files/module_spec.yaml index 588389a..3a98468 100644 --- a/8_merge_files/module_spec.yaml +++ b/8_merge_files/module_spec.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: microsoft.com/office moduleName: Merge every n files together version: 0.0.2 diff --git a/8_merge_files/module_spec.yaml-- b/8_merge_files/module_spec.yaml-- new file mode 100644 index 0000000..588389a --- /dev/null +++ b/8_merge_files/module_spec.yaml-- @@ -0,0 +1,27 @@ +amlModuleIdentifier: + namespace: microsoft.com/office + moduleName: Merge every n files together + version: 0.0.2 +metadata: + annotations: + familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 + tags: + - Office +inputs: +- name: InputFolder + type: [AzureEncryptedBlobReference, AnyDirectory] +- name: merge_count + type: Integer + default: 100 + optional: true +outputs: +- name: OutputFolder + type: AzureEncryptedBlobReference +implementation: + container: + image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + command: [python, merge.py] + args: + - inputPath: InputFolder + - outputPath: OutputFolder + - inputValue: merge_count diff --git a/9_smart_reply_pytorch.zip b/9_smart_reply_pytorch.zip index cd498e1a4fb16c5d52f097bf750b22fbf68f6504..baff88385d6f228ee90880bcdce5f0efb316a23e 100644 GIT binary patch delta 1281 zcmV+c1^)W&4Tczyf(@03eo)o=zyy5+001VDk2`D=iOaky;UNcMS;0VWCs8CQ2cu{P+laGFOCt*# zXOd54QLqfqgL~9R^xH;np5ERs)~n~IFPv)o8B}?AetP@(;rZz+82cQ3I((Hndx_pN zV>N%ukLybhlcQ<=y62vf0rcfqXGrEwj5>w#Yri()|%kqCZZxxPha-AyBCqi)KtH295%JjLdR zGF8;R+#pU(e#=TI9!6%-3&~FO(Y>fR4ss}HRoZQ|18q}IExL+*UGbUG)Y){bq!)iR zxPS#Kuf)f~&{LCP@T%9_x?qN@{!NEhWv< zLQ6hOEK1#1KpmiI?DhryUYBRi><_}i9&|InYM7wpDJ|6tJ;Q&;d~Fjvi5~U5#zm?$f7f&d@cbSyu6?^b*7G$mmI%4KshbX+By3 ziW(j!f1L9lcs*KrMGw?@78?E@OOuS`Y3M8b6alBAqGf6T@-d3#NW1upAoVu`jIVd^ z5s;N_i?RA?si&Lo=jhvc0=tX-zhdz*c_&4|_Fgz+^mnonwicOTG0ipcL(W9qNqF)y zFvep)f&Pd*S1INb##IR%d)I&Wf&*j{2l&S78qGM}yG6-#+!pfGRm97wdwjO1mzhWf zf-AO&XYrh5RZeGk+TDi`ccj{3Zq;lZCw1;fgZq!_`)P`sGR0CDM$hRK#H*Q7UOMjS zj)|!{*cT~&iHsB0+6n8a-zGCXNrh>y8U7E%>hSEjslMoRLb?Lm&HI1xClq0Q3cLn( zb#nmhcOWE`!vU<%jL|w8H;mTnKu9QE16ZG#kRd%9fXCbj>59z&-tTY%wvLK3)Dul; z$AysYDGQ3vNHsa`Qa8_Bx48+OoTLLVCWp$a3!0%E_Cl0 zk^Lg$I^=B=AuY`odUt<}P5-k%8%DKUFt0$9b&~6`*VSJ{SYP>VYmK;Qu0BNDN=Qp$ zg@BIni+kvc|HaicbE{*Rf05|htx T>+mr%Ff(v4GBBKHWdH&IG5HrT diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index c53f1aa..5428b89 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,4 +1,4 @@ -amlModuleIdentifier: +moduleIdentifier: namespace: microsoft.com/office moduleName: '[AE365][SmartReply][AML][Test] PyTorch Distributed' version: 0.0.2.0309172714 diff --git a/9_smart_reply_pytorch/module_spec.yaml-- b/9_smart_reply_pytorch/module_spec.yaml-- new file mode 100644 index 0000000..c53f1aa --- /dev/null +++ b/9_smart_reply_pytorch/module_spec.yaml-- @@ -0,0 +1,234 @@ +amlModuleIdentifier: + namespace: microsoft.com/office + moduleName: '[AE365][SmartReply][AML][Test] PyTorch Distributed' + version: 0.0.2.0309172714 +type: Mpi +metadata: + annotations: + familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d + tags: + - Office + - AE365 + - SmartReply + - AML + - Test +inputs: +- name: train_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: valid_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: gmr_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: vocab_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: rsp_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: pretrained_model_path + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: model_input_dir + type: + - AzureEncryptedBlobReference + - AnyDirectory + optional: true +- name: architecture + type: Enum + default: bert_matching_model + options: + - matching_model + - bert_matching_model +- name: pretrained_model_file + type: Enum + default: bert_encoder_epoch_500.pt + options: + - bert_encoder_epoch_500.pt + optional: true +- name: run_mode + type: Enum + default: train + options: + - train + - eval + - export +- name: load_from + type: Enum + default: tnlr + options: + - bert + - tnlr + optional: true +- name: max_epochs + type: Integer + default: 5 + optional: true +- name: lm_alpha + type: Float + default: 1.4 + optional: true +- name: batch_size + type: Integer + default: 256 + optional: true +- name: batch_size_infer + type: Integer + default: 256 + optional: true +- name: learning_rate + type: Float + default: 3e-4 + optional: true +- name: max_msg_len + type: Integer + default: 64 + optional: true +- name: max_rsp_len + type: Integer + default: 64 + optional: true +- name: decay_step + type: Integer + default: 2000 + optional: true +- name: decay_rate + type: Float + default: 0.99 + optional: true +- name: warmup_proportion + type: Float + default: 0.0002 + optional: true +- name: loss_scale + type: Integer + default: 0 + optional: true +- name: tokenizer + type: Enum + default: wordpiece + options: + - wordpiece + - sentencepiece + optional: true +- name: gradient_accumulation_steps + type: Integer + default: 1 + optional: true +- name: optimizer + type: Enum + default: adam + options: + - adam + - adadelta + optional: true +- name: validation_freq + type: Integer + default: -1 + optional: true +- name: save_freq + type: Integer + default: -1 + optional: true +- name: manual_seed + type: Integer + default: 42 + optional: true +- name: infer_batches + type: Integer + default: 1000 + optional: true +outputs: +- name: model_output_dir + type: AzureEncryptedBlobReference +- name: eval_output_dir + type: AzureEncryptedBlobReference +runConfig: + nodeCount: + type: Integer + default: 4 + min: 1 + processCountPerNode: + type: Integer + default: 2 +implementation: + container: + image: mcr.microsoft.com/azureml/bert:pretrain-openmpi3.1.2-cuda10.0-cudnn7-ubuntu16.04 + command: [/opt/miniconda/envs/amlbert/bin/python, smartreply/models/matching/driver.py] + args: + - --train_input_dir + - inputPath: train_input_dir + - --valid_input_dir + - inputPath: valid_input_dir + - --gmr_input_dir + - inputPath: gmr_input_dir + - --vocab_input_dir + - inputPath: vocab_input_dir + - --rsp_input_dir + - inputPath: rsp_input_dir + - --pretrained_model_path + - inputPath: pretrained_model_path + - --model_input_dir + - inputPath: model_input_dir + - --model_output_dir + - outputPath: model_output_dir + - --eval_output_dir + - outputPath: eval_output_dir + - --architecture + - inputValue: architecture + - --pretrained_model_file + - inputValue: pretrained_model_file + - --run_mode + - inputValue: run_mode + - --load_from + - inputValue: load_from + - --max_epochs + - inputValue: max_epochs + - --lm_alpha + - inputValue: lm_alpha + - --batch_size + - inputValue: batch_size + - --batch_size_infer + - inputValue: batch_size_infer + - --learning_rate + - inputValue: learning_rate + - --max_msg_len + - inputValue: max_msg_len + - --max_rsp_len + - inputValue: max_rsp_len + - --decay_step + - inputValue: decay_step + - --decay_rate + - inputValue: decay_rate + - --warmup_proportion + - inputValue: warmup_proportion + - --loss_scale + - inputValue: loss_scale + - --tokenizer + - inputValue: tokenizer + - --gradient_accumulation_steps + - inputValue: gradient_accumulation_steps + - --optimizer + - inputValue: optimizer + - --validation_freq + - inputValue: validation_freq + - --save_freq + - inputValue: save_freq + - --manual_seed + - inputValue: manual_seed + - --infer_batches + - inputValue: infer_batches diff --git a/multiple_specs.zip b/multiple_specs.zip index f2866b5fa95cadf582c7111f2af19cf3c23899eb..2c0d0e7ffa509faa131e6b59f7d79db1e8b54dc3 100644 GIT binary patch delta 204 zcmbQL@K%3<6r>yU zOq191c`zBVPX5WK2C_gv111Timo!STL9LrC%&*0?jcc+!zbn%v{>eKyR41?I=K)zg ac^AJlle{2ModF*^13QBp(4w89AX5NT<1tzQ delta 112 zcmaE>KUHCZ)aETr1yz-K`{-n0B=?{kT5F{)-W AkN^Mx diff --git a/multiple_specs/add_rows.yaml-- b/multiple_specs/add_rows.yaml-- new file mode 100644 index 0000000..05bb1d9 --- /dev/null +++ b/multiple_specs/add_rows.yaml-- @@ -0,0 +1,49 @@ +name: Add Rows +id: b2ebdabd-217d-4915-86cc-5b05972f7270 +version: 0.0.115 +isDeterministic: true +category: Data Transformation +description: Appends a set of rows from an input dataset to the end of another dataset. +releaseState: Release +inputs: +- name: Dataset1 + type: DataFrameDirectory + port: true + description: Dataset rows to be added to the output dataset first +- name: Dataset2 + type: DataFrameDirectory + port: true + description: Dataset rows to be appended to the first dataset +outputs: +- name: Results dataset + type: DataFrameDirectory + description: Dataset that contains all rows of both input datasets +implementation: + container: + runConfig: + baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + gpuSupport: false + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.115 + command: + - python + - -m + - azureml.studio.modulehost.module_invoker + - --module-name=azureml.studio.modules.datatransform.manipulation.add_rows.add_rows + args: + - --dataset1 + - inputPath: Dataset1 + - --dataset2 + - inputPath: Dataset2 + - --results-dataset + - outputPath: Results dataset + invoking: + module: azureml.studio.modules.datatransform.manipulation.add_rows.add_rows + class: AddRowsModule + func: run diff --git a/multiple_specs/clean_missing_data.yaml-- b/multiple_specs/clean_missing_data.yaml-- new file mode 100644 index 0000000..39d150a --- /dev/null +++ b/multiple_specs/clean_missing_data.yaml-- @@ -0,0 +1,130 @@ +name: Clean Missing Data +id: d2c5ca2f-7323-41a3-9b7e-da917c99f0c4 +version: 0.0.115 +isDeterministic: true +category: Data Transformation +description: Specifies how to handle the values missing from a dataset. +releaseState: Release +inputs: +- name: Dataset + type: DataFrameDirectory + port: true + description: Dataset to be cleaned +- name: Columns to be cleaned + type: ColumnPicker + description: Columns for missing values clean operation + columnPickerFor: Dataset +- name: Minimum missing value ratio + type: Float + description: Clean only column with missing value ratio above specified value, out + of set of all selected columns + default: 0.0 + min: 0.0 + max: 1.0 +- name: Maximum missing value ratio + type: Float + default: 1.0 + description: Clean only columns with missing value ratio below specified value, + out of set of all selected columns + min: 0.0 + max: 1.0 +- name: Cleaning mode + type: Mode + default: Custom substitution value + description: Algorithm to clean missing values + options: + - Custom substitution value: + - name: Replacement value + type: String + default: '0' + optional: true + description: Type the value that takes the place of missing values + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mean: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with median: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Replace with mode: + - name: Cols with all missing values + type: Mode + default: Remove + description: Cols with all missing values + options: + - Propagate + - Remove + - name: Generate missing value indicator column + type: Boolean + description: Generate a column that indicates which rows were cleaned + - Remove entire row + - Remove entire column +outputs: +- name: Cleaned dataset + type: DataFrameDirectory + description: Cleaned dataset +- name: Cleaning transformation + type: TransformationDirectory + description: Transformation to be passed to Apply Transformation module to clean + new data +implementation: + container: + runConfig: + baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 + gpuSupport: false + conda: + name: project_environment + channels: + - defaults + dependencies: + - python=3.6.8 + - pip: + - azureml-designer-classic-modules==0.0.115 + command: + - python + - -m + - azureml.studio.modulehost.module_invoker + - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + args: + - --dataset + - inputPath: Dataset + - --columns-to-be-cleaned + - inputValue: Columns to be cleaned + - --minimum-missing-value-ratio + - inputValue: Minimum missing value ratio + - --maximum-missing-value-ratio + - inputValue: Maximum missing value ratio + - --cleaning-mode + - inputValue: Cleaning mode + - --replacement-value + - inputValue: Replacement value + - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column + - --cleaned-dataset + - outputPath: Cleaned dataset + - --cleaning-transformation + - outputPath: Cleaning transformation + invoking: + module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data + class: CleanMissingDataModule + func: run diff --git a/multiple_specs_subfolder.zip b/multiple_specs_subfolder.zip index 3c75f46665b0fba9bb742194b13b05886e8af711..5a6b8d71fedd97802087eec89ac2bd47182c0c9d 100644 GIT binary patch delta 211 zcmX@5c-?S<6r;xE157fLJ@|Q delta 101 zcmca^cuH}C)aHXs5nP*(2(D&fRGVBNW`m8+R&16q@0VXAe$rpH(m~?eF*Rsd5Ffp@CmgAAy#OTS!Jhh{4vk&_X76pNA z Date: Mon, 30 Mar 2020 17:15:22 +0800 Subject: [PATCH 16/30] remove unused file --- .../clean_missing_data.yaml-- | 133 ------------------ 0_official_module/clean_missing_data.yaml-- | 131 ----------------- 2 files changed, 264 deletions(-) delete mode 100644 0.1_official_module_with_invoker/clean_missing_data.yaml-- delete mode 100644 0_official_module/clean_missing_data.yaml-- diff --git a/0.1_official_module_with_invoker/clean_missing_data.yaml-- b/0.1_official_module_with_invoker/clean_missing_data.yaml-- deleted file mode 100644 index 1377d47..0000000 --- a/0.1_official_module_with_invoker/clean_missing_data.yaml-- +++ /dev/null @@ -1,133 +0,0 @@ -amlModuleIdentifier: - namespace: zhizhu.com/test - moduleName: New Clean Missing Data - moduleVersion: 0.0.116.1 -isDeterministic: true -category: Data Transformation -description: Specifies how to handle the values missing from a dataset. -releaseState: Release -inputs: -- name: Dataset - type: DataFrameDirectory - port: true - description: Dataset to be cleaned -- name: Columns to be cleaned - type: ColumnPicker - description: Columns for missing values clean operation - columnPickerFor: Dataset -- name: Minimum missing value ratio - type: Float - description: Clean only column with missing value ratio above specified value, out - of set of all selected columns - default: 0.0 - min: 0.0 - max: 1.0 -- name: Maximum missing value ratio - type: Float - default: 1.0 - description: Clean only columns with missing value ratio below specified value, - out of set of all selected columns - min: 0.0 - max: 1.0 -- name: Cleaning mode - type: Mode - default: Custom substitution value - description: Algorithm to clean missing values - options: - - Custom substitution value: - - name: Replacement value - type: String - default: '0' - optional: true - description: Type the value that takes the place of missing values - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mean: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with median: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mode: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Remove entire row - - Remove entire column -outputs: -- name: Cleaned dataset - type: DataFrameDirectory - description: Cleaned dataset -- name: Cleaning transformation - type: TransformationDirectory - description: Transformation to be passed to Apply Transformation module to clean - new data -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.116 - command: - - python - - invoker.py - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - args: - - --dataset - - inputPath: Dataset - - --columns-to-be-cleaned - - inputValue: Columns to be cleaned - - --minimum-missing-value-ratio - - inputValue: Minimum missing value ratio - - --maximum-missing-value-ratio - - inputValue: Maximum missing value ratio - - --cleaning-mode - - inputValue: Cleaning mode - - - --replacement-value - - inputValue: Replacement value - - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column - - --cleaned-dataset - - outputPath: Cleaned dataset - - --cleaning-transformation - - outputPath: Cleaning transformation - invoking: - module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - class: CleanMissingDataModule - func: run diff --git a/0_official_module/clean_missing_data.yaml-- b/0_official_module/clean_missing_data.yaml-- deleted file mode 100644 index a412eec..0000000 --- a/0_official_module/clean_missing_data.yaml-- +++ /dev/null @@ -1,131 +0,0 @@ -amlModuleIdentifier: - namespace: zhizhu.com/test - moduleName: New Clean Missing Data - moduleVersion: 0.0.116.1 -isDeterministic: true -category: Data Transformation -description: Specifies how to handle the values missing from a dataset. -releaseState: Release -inputs: -- name: Dataset - type: DataFrameDirectory - port: true - description: Dataset to be cleaned -- name: Columns to be cleaned - type: ColumnPicker - description: Columns for missing values clean operation - columnPickerFor: Dataset -- name: Minimum missing value ratio - type: Float - description: Clean only column with missing value ratio above specified value, out - of set of all selected columns - default: 0.0 - min: 0.0 - max: 1.0 -- name: Maximum missing value ratio - type: Float - default: 1.0 - description: Clean only columns with missing value ratio below specified value, - out of set of all selected columns - min: 0.0 - max: 1.0 -- name: Cleaning mode - type: Mode - default: Custom substitution value - description: Algorithm to clean missing values - options: - - Custom substitution value: - - name: Replacement value - type: String - default: '0' - optional: true - description: Type the value that takes the place of missing values - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mean: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with median: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mode: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Remove entire row - - Remove entire column -outputs: -- name: Cleaned dataset - type: DataFrameDirectory - description: Cleaned dataset -- name: Cleaning transformation - type: TransformationDirectory - description: Transformation to be passed to Apply Transformation module to clean - new data -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.116 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - args: - - --dataset - - inputPath: Dataset - - --columns-to-be-cleaned - - inputValue: Columns to be cleaned - - --minimum-missing-value-ratio - - inputValue: Minimum missing value ratio - - --maximum-missing-value-ratio - - inputValue: Maximum missing value ratio - - --cleaning-mode - - inputValue: Cleaning mode - - - --replacement-value - - inputValue: Replacement value - - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column - - --cleaned-dataset - - outputPath: Cleaned dataset - - --cleaning-transformation - - outputPath: Cleaning transformation - invoking: - module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - class: CleanMissingDataModule - func: run From 8fd4841fb8610ea1d7a3a46ffb84e4672d7a312b Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:16:54 +0800 Subject: [PATCH 17/30] remove unused files --- 10_invalid_yaml/invalid.yaml-- | 1 - 10_invalid_yaml/invalid2.yaml-- | 1 - 10_invalid_yaml/invalid3.yaml-- | 1 - 10_invalid_yaml/invalid4.yaml-- | 6 - 10_invalid_yaml/module_spec.yaml-- | 234 ------------------ 1_basic_kfc/kubeflow.yaml-- | 19 -- 2.2_eselect_fix_port_type/eselect.yaml-- | 25 -- .../module_spec.yaml-- | 17 -- 2_eselect/eselect.yaml-- | 24 -- 3_basic_module/basic_module.yaml-- | 35 --- 4_mpi_module/mpi_module.yaml-- | 71 ------ 5_mpi_module_using_env/mpi_module.yaml-- | 62 ----- 6_hdi_module/hdi_module.yaml-- | 34 --- .../kfc.yaml-- | 21 -- .../kfc.yaml-- | 29 --- 7_kfc_merge_files/kfc.yaml-- | 19 -- 8_merge_files/module_spec.yaml-- | 27 -- 9_smart_reply_pytorch/module_spec.yaml-- | 234 ------------------ multiple_specs/add_rows.yaml-- | 49 ---- multiple_specs/clean_missing_data.yaml-- | 130 ---------- multiple_specs_subfolder/add_rows.yaml-- | 49 ---- .../spec/clean_missing_data.yaml-- | 130 ---------- one_spec/clean_missing_data.yaml-- | 130 ---------- 23 files changed, 1348 deletions(-) delete mode 100644 10_invalid_yaml/invalid.yaml-- delete mode 100644 10_invalid_yaml/invalid2.yaml-- delete mode 100644 10_invalid_yaml/invalid3.yaml-- delete mode 100644 10_invalid_yaml/invalid4.yaml-- delete mode 100644 10_invalid_yaml/module_spec.yaml-- delete mode 100644 1_basic_kfc/kubeflow.yaml-- delete mode 100644 2.2_eselect_fix_port_type/eselect.yaml-- delete mode 100644 2.3_eselect_commands_with_placeholders/module_spec.yaml-- delete mode 100644 2_eselect/eselect.yaml-- delete mode 100644 3_basic_module/basic_module.yaml-- delete mode 100644 4_mpi_module/mpi_module.yaml-- delete mode 100644 5_mpi_module_using_env/mpi_module.yaml-- delete mode 100644 6_hdi_module/hdi_module.yaml-- delete mode 100644 7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- delete mode 100644 7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml-- delete mode 100644 7_kfc_merge_files/kfc.yaml-- delete mode 100644 8_merge_files/module_spec.yaml-- delete mode 100644 9_smart_reply_pytorch/module_spec.yaml-- delete mode 100644 multiple_specs/add_rows.yaml-- delete mode 100644 multiple_specs/clean_missing_data.yaml-- delete mode 100644 multiple_specs_subfolder/add_rows.yaml-- delete mode 100644 multiple_specs_subfolder/spec/clean_missing_data.yaml-- delete mode 100644 one_spec/clean_missing_data.yaml-- diff --git a/10_invalid_yaml/invalid.yaml-- b/10_invalid_yaml/invalid.yaml-- deleted file mode 100644 index 8507427..0000000 --- a/10_invalid_yaml/invalid.yaml-- +++ /dev/null @@ -1 +0,0 @@ -hello: diff --git a/10_invalid_yaml/invalid2.yaml-- b/10_invalid_yaml/invalid2.yaml-- deleted file mode 100644 index 843842c..0000000 --- a/10_invalid_yaml/invalid2.yaml-- +++ /dev/null @@ -1 +0,0 @@ -incomplete_list: [ diff --git a/10_invalid_yaml/invalid3.yaml-- b/10_invalid_yaml/invalid3.yaml-- deleted file mode 100644 index 7cc86ad..0000000 --- a/10_invalid_yaml/invalid3.yaml-- +++ /dev/null @@ -1 +0,0 @@ -666 diff --git a/10_invalid_yaml/invalid4.yaml-- b/10_invalid_yaml/invalid4.yaml-- deleted file mode 100644 index eaf3db2..0000000 --- a/10_invalid_yaml/invalid4.yaml-- +++ /dev/null @@ -1,6 +0,0 @@ -import sys - - -if __name__ == '__main__': - print(sys.argv) - diff --git a/10_invalid_yaml/module_spec.yaml-- b/10_invalid_yaml/module_spec.yaml-- deleted file mode 100644 index 9c4ea99..0000000 --- a/10_invalid_yaml/module_spec.yaml-- +++ /dev/null @@ -1,234 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office - moduleName: [AE365][SmartReply][AML][Test] PyTorch Distributed - moduleVersion: 0.0.2.0309172714 -type: Mpi -metadata: - annotations: - familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d - labels: - - Office - - AE365 - - SmartReply - - AML - - Test -inputs: -- name: train_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: valid_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: gmr_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: vocab_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: rsp_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: pretrained_model_path - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: model_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: architecture - type: Enum - default: bert_matching_model - options: - - matching_model - - bert_matching_model -- name: pretrained_model_file - type: Enum - default: bert_encoder_epoch_500.pt - options: - - bert_encoder_epoch_500.pt - optional: true -- name: run_mode - type: Enum - default: train - options: - - train - - eval - - export -- name: load_from - type: Enum - default: tnlr - options: - - bert - - tnlr - optional: true -- name: max_epochs - type: Integer - default: 5 - optional: true -- name: lm_alpha - type: Float - default: 1.4 - optional: true -- name: batch_size - type: Integer - default: 256 - optional: true -- name: batch_size_infer - type: Integer - default: 256 - optional: true -- name: learning_rate - type: Float - default: 3e-4 - optional: true -- name: max_msg_len - type: Integer - default: 64 - optional: true -- name: max_rsp_len - type: Integer - default: 64 - optional: true -- name: decay_step - type: Integer - default: 2000 - optional: true -- name: decay_rate - type: Float - default: 0.99 - optional: true -- name: warmup_proportion - type: Float - default: 0.0002 - optional: true -- name: loss_scale - type: Integer - default: 0 - optional: true -- name: tokenizer - type: Enum - default: wordpiece - options: - - wordpiece - - sentencepiece - optional: true -- name: gradient_accumulation_steps - type: Integer - default: 1 - optional: true -- name: optimizer - type: Enum - default: adam - options: - - adam - - adadelta - optional: true -- name: validation_freq - type: Integer - default: -1 - optional: true -- name: save_freq - type: Integer - default: -1 - optional: true -- name: manual_seed - type: Integer - default: 42 - optional: true -- name: infer_batches - type: Integer - default: 1000 - optional: true -outputs: -- name: model_output_dir - type: AzureEncryptedBlobReference -- name: eval_output_dir - type: AzureEncryptedBlobReference -runConfig: - nodeCount: - type: Integer - default: 4 - min: 1 - processCountPerNode: - type: Integer - default: 2 -implementation: - container: - image: mcr.microsoft.com/azureml/bert:pretrain-openmpi3.1.2-cuda10.0-cudnn7-ubuntu16.04 - command: [/opt/miniconda/envs/amlbert/bin/python, smartreply/models/matching/driver.py] - args: - - --train_input_dir - - inputPath: train_input_dir - - --valid_input_dir - - inputPath: valid_input_dir - - --gmr_input_dir - - inputPath: gmr_input_dir - - --vocab_input_dir - - inputPath: vocab_input_dir - - --rsp_input_dir - - inputPath: rsp_input_dir - - --pretrained_model_path - - inputPath: pretrained_model_path - - --model_input_dir - - inputPath: model_input_dir - - --model_output_dir - - outputPath: model_output_dir - - --eval_output_dir - - outputPath: eval_output_dir - - --architecture - - inputValue: architecture - - --pretrained_model_file - - inputValue: pretrained_model_file - - --run_mode - - inputValue: run_mode - - --load_from - - inputValue: load_from - - --max_epochs - - inputValue: max_epochs - - --lm_alpha - - inputValue: lm_alpha - - --batch_size - - inputValue: batch_size - - --batch_size_infer - - inputValue: batch_size_infer - - --learning_rate - - inputValue: learning_rate - - --max_msg_len - - inputValue: max_msg_len - - --max_rsp_len - - inputValue: max_rsp_len - - --decay_step - - inputValue: decay_step - - --decay_rate - - inputValue: decay_rate - - --warmup_proportion - - inputValue: warmup_proportion - - --loss_scale - - inputValue: loss_scale - - --tokenizer - - inputValue: tokenizer - - --gradient_accumulation_steps - - inputValue: gradient_accumulation_steps - - --optimizer - - inputValue: optimizer - - --validation_freq - - inputValue: validation_freq - - --save_freq - - inputValue: save_freq - - --manual_seed - - inputValue: manual_seed - - --infer_batches - - inputValue: infer_batches diff --git a/1_basic_kfc/kubeflow.yaml-- b/1_basic_kfc/kubeflow.yaml-- deleted file mode 100644 index 51a979e..0000000 --- a/1_basic_kfc/kubeflow.yaml-- +++ /dev/null @@ -1,19 +0,0 @@ -name: xgboost4j - Train classifier -description: Trains a boosted tree ensemble classifier using xgboost4j - -inputs: -- {name: Training data} -- {name: Rounds, type: Integer, default: '30', help: Number of training rounds} - -outputs: -- {name: Trained model, type: XGBoost model, help: Trained XGBoost model} - -implementation: - container: - image: gcr.io/ml-pipeline/xgboost-classifier-train@sha256:b3a64d57 - command: [ - /ml/train.py, - --train-set, {inputPath: Training data}, - --rounds, {inputValue: Rounds}, - --out-model, {outputPath: Trained model}, - ] diff --git a/2.2_eselect_fix_port_type/eselect.yaml-- b/2.2_eselect_fix_port_type/eselect.yaml-- deleted file mode 100644 index 60bdb9e..0000000 --- a/2.2_eselect_fix_port_type/eselect.yaml-- +++ /dev/null @@ -1,25 +0,0 @@ -amlModuleIdentifier: - namespace: example.com/modules - moduleName: eselect - moduleVersion: 0.0.2 -description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. -inputs: -- name: columns - type: String -- name: input - type: AnyDirectory -outputs: -- name: output - type: AnyFile -implementation: - container: - image: ttthree/modules:latest - command: [python, /home/invoker.py] - args: - - dotnet - - /home/etools/eselect.dll - - -f - - inputValue: columns - - inputPath: input - - outputPath: output - diff --git a/2.3_eselect_commands_with_placeholders/module_spec.yaml-- b/2.3_eselect_commands_with_placeholders/module_spec.yaml-- deleted file mode 100644 index 7164159..0000000 --- a/2.3_eselect_commands_with_placeholders/module_spec.yaml-- +++ /dev/null @@ -1,17 +0,0 @@ -amlModuleIdentifier: - namespace: example.com/modules - moduleName: eselect - moduleVersion: 0.0.1 -description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. -inputs: - - {name: columns, type: String, description: 'column name list with ; as delimeter'} - - {name: input, type: AnyFile, description: 'the input file path, only TSV supported'} -outputs: - - {name: output, type: AnyFile, description: 'the output file path'} -implementation: - container: - image: ttthree/modules:latest - command: [ - python, /home/invoker.py, dotnet, /home/etools/eselect.dll, -f, {inputValue: columns}, {inputPath: input}, {outputPath: output} - ] - diff --git a/2_eselect/eselect.yaml-- b/2_eselect/eselect.yaml-- deleted file mode 100644 index dafc3bf..0000000 --- a/2_eselect/eselect.yaml-- +++ /dev/null @@ -1,24 +0,0 @@ -amlModuleIdentifier: - moduleName: eselect - moduleVersion: 0.0.1 -description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. -inputs: -- name: columns - type: String -- name: input - type: String -outputs: -- name: output - type: AnyFile -implementation: - container: - image: ttthree/modules:latest - command: [python, /home/invoker.py] - args: - - dotnet - - /home/etools/eselect.dll - - -f - - inputValue: columns - - inputPath: input - - outputPath: output - diff --git a/3_basic_module/basic_module.yaml-- b/3_basic_module/basic_module.yaml-- deleted file mode 100644 index 4d2c3cd..0000000 --- a/3_basic_module/basic_module.yaml-- +++ /dev/null @@ -1,35 +0,0 @@ -amlModuleIdentifier: - namespace: example.com/modules - moduleName: Basic Module - moduleVersion: 0.0.2 -description: | - Basic module for demo. - No `type` specified in spec and will defaults to 'Basic'. - Demos how to specify an environment from a pre-built docker image. -metadata: - properties: - tags: [nlp, bert] - contact: AzureML Studio Team - helpDocument: http://readthedocs.com/proj -inputs: - - name: Input Port - type: DataFrameDirectory - - name: Parameter 1 - type: String - default: hello - - name: Parameter 2 - type: Integer - default: 1 -outputs: - - name: Output Port - type: DataFrameDirectory -implementation: - container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - command: [python, module_entry.py] - args: [ - --input, {inputPath: Input Port }, - --parameter-1, { inputValue: Parameter 1 }, - --parameter-2, { inputValue: Parameter 2 }, - --output, { outputPath: Output Port }, - ] diff --git a/4_mpi_module/mpi_module.yaml-- b/4_mpi_module/mpi_module.yaml-- deleted file mode 100644 index cbd5417..0000000 --- a/4_mpi_module/mpi_module.yaml-- +++ /dev/null @@ -1,71 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office/demo - moduleName: Mpi Module - moduleVersion: 0.0.1 -type: Mpi -description: | - Mpi module for demo. - To create an MPI module: - * Set `type` to 'Mpi'. - * Optional: add `runConfig` to specify the specification of run-level configurations. - This module also demos: - * Input port which supports multiple data types. - * Specification of Integer / Mode parameters. - * How to use a pre-registered environment of the worksapace. -metadata: - properties: - tags: [nlp, bert] - contact: AzureML Studio Team - helpDocument: http://readthedocs.com/proj -inputs: - - name: Input Port - type: [DataFrameDirectory, ImageDirectory] - - name: Parameter 1 - type: String - default: hello - description: Input a greeting message. - - name: Parameter 2 - type: Enum - default: Red - options: [Red, Green, Blue] - description: Choose your favorite color. - - name: Parameter 3 - type: Integer - default: 1 - min: 0 - max: 10 - description: The Integer parameter which has a range validation. -outputs: - - name: Output Port - type: DataFrameDirectory -runConfig: - nodeCount: - type: Integer - default: 4 - min: 1 - max: 10 - processCountPerNode: - type: Integer - default: 2 -implementation: - container: - amlEnvironment: - docker: - baseImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - python: - condaDenpendencies: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.116 - command: [python, module_entry.py] - args: [ - --input, {inputPath: Input Port }, - --parameter-1, { inputValue: Parameter 1 }, - --parameter-2, { inputValue: Parameter 2 }, - --parameter-3, { inputValue: Parameter 3 }, - --output, { outputPath: Output Port }, - ] diff --git a/5_mpi_module_using_env/mpi_module.yaml-- b/5_mpi_module_using_env/mpi_module.yaml-- deleted file mode 100644 index 18a7eb9..0000000 --- a/5_mpi_module_using_env/mpi_module.yaml-- +++ /dev/null @@ -1,62 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office/demo - moduleName: Mpi Module - moduleVersion: 0.0.1 -type: Mpi -description: | - Mpi module for demo. - To create an MPI module: - * Set `type` to 'Mpi'. - * Optional: add `runConfig` to specify the specification of run-level configurations. - This module also demos: - * Input port which supports multiple data types. - * Specification of Integer / Mode parameters. - * How to use a pre-registered environment of the worksapace. -metadata: - properties: - tags: [nlp, bert] - contact: AzureML Studio Team - helpDocument: http://readthedocs.com/proj -inputs: - - name: Input Port - type: [DataFrameDirectory, ImageDirectory] - - name: Parameter 1 - type: String - default: hello - description: Input a greeting message. - - name: Parameter 2 - type: Enum - default: Red - options: [Red, Green, Blue] - description: Choose your favorite color. - - name: Parameter 3 - type: Integer - default: 1 - min: 0 - max: 10 - description: The Integer parameter which has a range validation. -outputs: - - name: Output Port - type: DataFrameDirectory -runConfig: - nodeCount: - type: Integer - default: 4 - min: 1 - max: 10 - processCountPerNode: - type: Integer - default: 2 -implementation: - container: - amlEnvironment: - name: DemoEnv - version: 0.0.1 - command: [python, module_entry.py] - args: [ - --input, {inputPath: Input Port }, - --parameter-1, { inputValue: Parameter 1 }, - --parameter-2, { inputValue: Parameter 2 }, - --parameter-3, { inputValue: Parameter 3 }, - --output, { outputPath: Output Port }, - ] diff --git a/6_hdi_module/hdi_module.yaml-- b/6_hdi_module/hdi_module.yaml-- deleted file mode 100644 index 7adc4c7..0000000 --- a/6_hdi_module/hdi_module.yaml-- +++ /dev/null @@ -1,34 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office/demo - moduleName: HDInsight Module - moduleVersion: 0.0.1 -type: HDInsight -description: | - HDInsight module for demo. -metadata: - properties: - tags: [nlp, bert] - contact: AzureML Studio Team - helpDocument: http://readthedocs.com/proj -inputs: - - name: Input Port - type: DataFrameDirectory - - name: Parameter 1 - type: String - default: hello - - name: Parameter 2 - type: Integer - default: 1 -outputs: - - name: Output Port - type: DataFrameDirectory -implementation: - container: - image: office/module_runner_docker - command: [python, module_entry.py] - args: [ - --input, {inputPath: Input Port }, - --parameter-1, { inputValue: Parameter 1 }, - --parameter-2, { inputValue: Parameter 2 }, - --output, { outputPath: Output Port }, - ] diff --git a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- deleted file mode 100644 index 53d831c..0000000 --- a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml-- +++ /dev/null @@ -1,21 +0,0 @@ -amlIdentifier: - moduleName: Merge every n files together cdd3b0ba - version: 0.0.1 -inputs: -- name: InputFolder - type: LocalPath -- name: merge_count - type: Integer - default: '100' - optional: true -outputs: -- name: OutputFolder - type: LocalPath -implementation: - container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - command: [python, merge.py] - args: - - inputPath: InputFolder - - outputPath: OutputFolder - - inputValue: merge_count diff --git a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml-- b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml-- deleted file mode 100644 index b861c7b..0000000 --- a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml-- +++ /dev/null @@ -1,29 +0,0 @@ -amlIdentifier: - moduleName: Merge every n files together cdd3b0ba - version: 0.0.1 -inputs: -- name: InputFolder - type: - LocalPath: - openapi_schema_validator: - type: string - pattern: "^file://.*$" -- name: merge_count - type: Integer - default: '100' - optional: true -outputs: -- name: OutputFolder - type: - LocalPath: - openapi_schema_validator: - type: string - pattern: "^file://.*$" -implementation: - container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - command: [python, merge.py] - args: - - inputPath: InputFolder - - outputPath: OutputFolder - - inputValue: merge_count diff --git a/7_kfc_merge_files/kfc.yaml-- b/7_kfc_merge_files/kfc.yaml-- deleted file mode 100644 index 9c3add3..0000000 --- a/7_kfc_merge_files/kfc.yaml-- +++ /dev/null @@ -1,19 +0,0 @@ -name: Merge every n files together cdd3b0ba -inputs: -- name: InputFolder - type: LocalPath -- name: merge_count - type: Integer - default: '100' - optional: true -outputs: -- name: OutputFolder - type: LocalPath -implementation: - container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - command: [python, merge.py] - args: - - inputPath: InputFolder - - outputPath: OutputFolder - - inputValue: merge_count diff --git a/8_merge_files/module_spec.yaml-- b/8_merge_files/module_spec.yaml-- deleted file mode 100644 index 588389a..0000000 --- a/8_merge_files/module_spec.yaml-- +++ /dev/null @@ -1,27 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office - moduleName: Merge every n files together - version: 0.0.2 -metadata: - annotations: - familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 - tags: - - Office -inputs: -- name: InputFolder - type: [AzureEncryptedBlobReference, AnyDirectory] -- name: merge_count - type: Integer - default: 100 - optional: true -outputs: -- name: OutputFolder - type: AzureEncryptedBlobReference -implementation: - container: - image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - command: [python, merge.py] - args: - - inputPath: InputFolder - - outputPath: OutputFolder - - inputValue: merge_count diff --git a/9_smart_reply_pytorch/module_spec.yaml-- b/9_smart_reply_pytorch/module_spec.yaml-- deleted file mode 100644 index c53f1aa..0000000 --- a/9_smart_reply_pytorch/module_spec.yaml-- +++ /dev/null @@ -1,234 +0,0 @@ -amlModuleIdentifier: - namespace: microsoft.com/office - moduleName: '[AE365][SmartReply][AML][Test] PyTorch Distributed' - version: 0.0.2.0309172714 -type: Mpi -metadata: - annotations: - familyId: 439f6c66-ab56-4798-9bab-ed3154c71c3d - tags: - - Office - - AE365 - - SmartReply - - AML - - Test -inputs: -- name: train_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: valid_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: gmr_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: vocab_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: rsp_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: pretrained_model_path - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: model_input_dir - type: - - AzureEncryptedBlobReference - - AnyDirectory - optional: true -- name: architecture - type: Enum - default: bert_matching_model - options: - - matching_model - - bert_matching_model -- name: pretrained_model_file - type: Enum - default: bert_encoder_epoch_500.pt - options: - - bert_encoder_epoch_500.pt - optional: true -- name: run_mode - type: Enum - default: train - options: - - train - - eval - - export -- name: load_from - type: Enum - default: tnlr - options: - - bert - - tnlr - optional: true -- name: max_epochs - type: Integer - default: 5 - optional: true -- name: lm_alpha - type: Float - default: 1.4 - optional: true -- name: batch_size - type: Integer - default: 256 - optional: true -- name: batch_size_infer - type: Integer - default: 256 - optional: true -- name: learning_rate - type: Float - default: 3e-4 - optional: true -- name: max_msg_len - type: Integer - default: 64 - optional: true -- name: max_rsp_len - type: Integer - default: 64 - optional: true -- name: decay_step - type: Integer - default: 2000 - optional: true -- name: decay_rate - type: Float - default: 0.99 - optional: true -- name: warmup_proportion - type: Float - default: 0.0002 - optional: true -- name: loss_scale - type: Integer - default: 0 - optional: true -- name: tokenizer - type: Enum - default: wordpiece - options: - - wordpiece - - sentencepiece - optional: true -- name: gradient_accumulation_steps - type: Integer - default: 1 - optional: true -- name: optimizer - type: Enum - default: adam - options: - - adam - - adadelta - optional: true -- name: validation_freq - type: Integer - default: -1 - optional: true -- name: save_freq - type: Integer - default: -1 - optional: true -- name: manual_seed - type: Integer - default: 42 - optional: true -- name: infer_batches - type: Integer - default: 1000 - optional: true -outputs: -- name: model_output_dir - type: AzureEncryptedBlobReference -- name: eval_output_dir - type: AzureEncryptedBlobReference -runConfig: - nodeCount: - type: Integer - default: 4 - min: 1 - processCountPerNode: - type: Integer - default: 2 -implementation: - container: - image: mcr.microsoft.com/azureml/bert:pretrain-openmpi3.1.2-cuda10.0-cudnn7-ubuntu16.04 - command: [/opt/miniconda/envs/amlbert/bin/python, smartreply/models/matching/driver.py] - args: - - --train_input_dir - - inputPath: train_input_dir - - --valid_input_dir - - inputPath: valid_input_dir - - --gmr_input_dir - - inputPath: gmr_input_dir - - --vocab_input_dir - - inputPath: vocab_input_dir - - --rsp_input_dir - - inputPath: rsp_input_dir - - --pretrained_model_path - - inputPath: pretrained_model_path - - --model_input_dir - - inputPath: model_input_dir - - --model_output_dir - - outputPath: model_output_dir - - --eval_output_dir - - outputPath: eval_output_dir - - --architecture - - inputValue: architecture - - --pretrained_model_file - - inputValue: pretrained_model_file - - --run_mode - - inputValue: run_mode - - --load_from - - inputValue: load_from - - --max_epochs - - inputValue: max_epochs - - --lm_alpha - - inputValue: lm_alpha - - --batch_size - - inputValue: batch_size - - --batch_size_infer - - inputValue: batch_size_infer - - --learning_rate - - inputValue: learning_rate - - --max_msg_len - - inputValue: max_msg_len - - --max_rsp_len - - inputValue: max_rsp_len - - --decay_step - - inputValue: decay_step - - --decay_rate - - inputValue: decay_rate - - --warmup_proportion - - inputValue: warmup_proportion - - --loss_scale - - inputValue: loss_scale - - --tokenizer - - inputValue: tokenizer - - --gradient_accumulation_steps - - inputValue: gradient_accumulation_steps - - --optimizer - - inputValue: optimizer - - --validation_freq - - inputValue: validation_freq - - --save_freq - - inputValue: save_freq - - --manual_seed - - inputValue: manual_seed - - --infer_batches - - inputValue: infer_batches diff --git a/multiple_specs/add_rows.yaml-- b/multiple_specs/add_rows.yaml-- deleted file mode 100644 index 05bb1d9..0000000 --- a/multiple_specs/add_rows.yaml-- +++ /dev/null @@ -1,49 +0,0 @@ -name: Add Rows -id: b2ebdabd-217d-4915-86cc-5b05972f7270 -version: 0.0.115 -isDeterministic: true -category: Data Transformation -description: Appends a set of rows from an input dataset to the end of another dataset. -releaseState: Release -inputs: -- name: Dataset1 - type: DataFrameDirectory - port: true - description: Dataset rows to be added to the output dataset first -- name: Dataset2 - type: DataFrameDirectory - port: true - description: Dataset rows to be appended to the first dataset -outputs: -- name: Results dataset - type: DataFrameDirectory - description: Dataset that contains all rows of both input datasets -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.115 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.manipulation.add_rows.add_rows - args: - - --dataset1 - - inputPath: Dataset1 - - --dataset2 - - inputPath: Dataset2 - - --results-dataset - - outputPath: Results dataset - invoking: - module: azureml.studio.modules.datatransform.manipulation.add_rows.add_rows - class: AddRowsModule - func: run diff --git a/multiple_specs/clean_missing_data.yaml-- b/multiple_specs/clean_missing_data.yaml-- deleted file mode 100644 index 39d150a..0000000 --- a/multiple_specs/clean_missing_data.yaml-- +++ /dev/null @@ -1,130 +0,0 @@ -name: Clean Missing Data -id: d2c5ca2f-7323-41a3-9b7e-da917c99f0c4 -version: 0.0.115 -isDeterministic: true -category: Data Transformation -description: Specifies how to handle the values missing from a dataset. -releaseState: Release -inputs: -- name: Dataset - type: DataFrameDirectory - port: true - description: Dataset to be cleaned -- name: Columns to be cleaned - type: ColumnPicker - description: Columns for missing values clean operation - columnPickerFor: Dataset -- name: Minimum missing value ratio - type: Float - description: Clean only column with missing value ratio above specified value, out - of set of all selected columns - default: 0.0 - min: 0.0 - max: 1.0 -- name: Maximum missing value ratio - type: Float - default: 1.0 - description: Clean only columns with missing value ratio below specified value, - out of set of all selected columns - min: 0.0 - max: 1.0 -- name: Cleaning mode - type: Mode - default: Custom substitution value - description: Algorithm to clean missing values - options: - - Custom substitution value: - - name: Replacement value - type: String - default: '0' - optional: true - description: Type the value that takes the place of missing values - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mean: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with median: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mode: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Remove entire row - - Remove entire column -outputs: -- name: Cleaned dataset - type: DataFrameDirectory - description: Cleaned dataset -- name: Cleaning transformation - type: TransformationDirectory - description: Transformation to be passed to Apply Transformation module to clean - new data -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.115 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - args: - - --dataset - - inputPath: Dataset - - --columns-to-be-cleaned - - inputValue: Columns to be cleaned - - --minimum-missing-value-ratio - - inputValue: Minimum missing value ratio - - --maximum-missing-value-ratio - - inputValue: Maximum missing value ratio - - --cleaning-mode - - inputValue: Cleaning mode - - --replacement-value - - inputValue: Replacement value - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column - - --cleaned-dataset - - outputPath: Cleaned dataset - - --cleaning-transformation - - outputPath: Cleaning transformation - invoking: - module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - class: CleanMissingDataModule - func: run diff --git a/multiple_specs_subfolder/add_rows.yaml-- b/multiple_specs_subfolder/add_rows.yaml-- deleted file mode 100644 index 062c691..0000000 --- a/multiple_specs_subfolder/add_rows.yaml-- +++ /dev/null @@ -1,49 +0,0 @@ -name: Add Rows -id: b2ebdabd-217d-4915-86cc-5b05972f7270 -version: 0.0.114.1 -isDeterministic: true -category: Data Transformation -description: Appends a set of rows from an input dataset to the end of another dataset. -releaseState: Release -inputs: -- name: Dataset1 - type: DataFrameDirectory - port: true - description: Dataset rows to be added to the output dataset first -- name: Dataset2 - type: DataFrameDirectory - port: true - description: Dataset rows to be appended to the first dataset -outputs: -- name: Results dataset - type: DataFrameDirectory - description: Dataset that contains all rows of both input datasets -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.115 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.manipulation.add_rows.add_rows - args: - - --dataset1 - - inputPath: Dataset1 - - --dataset2 - - inputPath: Dataset2 - - --results-dataset - - outputPath: Results dataset - invoking: - module: azureml.studio.modules.datatransform.manipulation.add_rows.add_rows - class: AddRowsModule - func: run diff --git a/multiple_specs_subfolder/spec/clean_missing_data.yaml-- b/multiple_specs_subfolder/spec/clean_missing_data.yaml-- deleted file mode 100644 index 39d150a..0000000 --- a/multiple_specs_subfolder/spec/clean_missing_data.yaml-- +++ /dev/null @@ -1,130 +0,0 @@ -name: Clean Missing Data -id: d2c5ca2f-7323-41a3-9b7e-da917c99f0c4 -version: 0.0.115 -isDeterministic: true -category: Data Transformation -description: Specifies how to handle the values missing from a dataset. -releaseState: Release -inputs: -- name: Dataset - type: DataFrameDirectory - port: true - description: Dataset to be cleaned -- name: Columns to be cleaned - type: ColumnPicker - description: Columns for missing values clean operation - columnPickerFor: Dataset -- name: Minimum missing value ratio - type: Float - description: Clean only column with missing value ratio above specified value, out - of set of all selected columns - default: 0.0 - min: 0.0 - max: 1.0 -- name: Maximum missing value ratio - type: Float - default: 1.0 - description: Clean only columns with missing value ratio below specified value, - out of set of all selected columns - min: 0.0 - max: 1.0 -- name: Cleaning mode - type: Mode - default: Custom substitution value - description: Algorithm to clean missing values - options: - - Custom substitution value: - - name: Replacement value - type: String - default: '0' - optional: true - description: Type the value that takes the place of missing values - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mean: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with median: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mode: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Remove entire row - - Remove entire column -outputs: -- name: Cleaned dataset - type: DataFrameDirectory - description: Cleaned dataset -- name: Cleaning transformation - type: TransformationDirectory - description: Transformation to be passed to Apply Transformation module to clean - new data -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.115 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - args: - - --dataset - - inputPath: Dataset - - --columns-to-be-cleaned - - inputValue: Columns to be cleaned - - --minimum-missing-value-ratio - - inputValue: Minimum missing value ratio - - --maximum-missing-value-ratio - - inputValue: Maximum missing value ratio - - --cleaning-mode - - inputValue: Cleaning mode - - --replacement-value - - inputValue: Replacement value - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column - - --cleaned-dataset - - outputPath: Cleaned dataset - - --cleaning-transformation - - outputPath: Cleaning transformation - invoking: - module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - class: CleanMissingDataModule - func: run diff --git a/one_spec/clean_missing_data.yaml-- b/one_spec/clean_missing_data.yaml-- deleted file mode 100644 index 7b4a0de..0000000 --- a/one_spec/clean_missing_data.yaml-- +++ /dev/null @@ -1,130 +0,0 @@ -name: My Awesome Module -id: d2c5ca2f-7323-41a3-900e-da917c99f0c4 -version: 0.0.6.6 -isDeterministic: true -category: Data Transformation -description: Specifies how to handle the values missing from a dataset. -releaseState: Release -inputs: -- name: Dataset - type: DataFrameDirectory - port: true - description: Dataset to be cleaned -- name: Columns to be cleaned - type: ColumnPicker - description: Columns for missing values clean operation - columnPickerFor: Dataset -- name: Minimum missing value ratio - type: Float - description: Clean only column with missing value ratio above specified value, out - of set of all selected columns - default: 0.0 - min: 0.0 - max: 1.0 -- name: Maximum missing value ratio - type: Float - default: 1.0 - description: Clean only columns with missing value ratio below specified value, - out of set of all selected columns - min: 0.0 - max: 1.0 -- name: Cleaning mode - type: Mode - default: Custom substitution value - description: Algorithm to clean missing values - options: - - Custom substitution value: - - name: Replacement value - type: String - default: '0' - optional: true - description: Type the value that takes the place of missing values - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mean: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with median: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Replace with mode: - - name: Cols with all missing values - type: Mode - default: Remove - description: Cols with all missing values - options: - - Propagate - - Remove - - name: Generate missing value indicator column - type: Boolean - description: Generate a column that indicates which rows were cleaned - - Remove entire row - - Remove entire column -outputs: -- name: Cleaned dataset - type: DataFrameDirectory - description: Cleaned dataset -- name: Cleaning transformation - type: TransformationDirectory - description: Transformation to be passed to Apply Transformation module to clean - new data -implementation: - container: - runConfig: - baseDockerImage: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 - gpuSupport: false - conda: - name: project_environment - channels: - - defaults - dependencies: - - python=3.6.8 - - pip: - - azureml-designer-classic-modules==0.0.115 - command: - - python - - -m - - azureml.studio.modulehost.module_invoker - - --module-name=azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - args: - - --dataset - - inputPath: Dataset - - --columns-to-be-cleaned - - inputValue: Columns to be cleaned - - --minimum-missing-value-ratio - - inputValue: Minimum missing value ratio - - --maximum-missing-value-ratio - - inputValue: Maximum missing value ratio - - --cleaning-mode - - inputValue: Cleaning mode - - --replacement-value - - inputValue: Replacement value - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column - - --cleaned-dataset - - outputPath: Cleaned dataset - - --cleaning-transformation - - outputPath: Cleaning transformation - invoking: - module: azureml.studio.modules.datatransform.clean_missing_data.clean_missing_data - class: CleanMissingDataModule - func: run From dcf82ff582fcac74fc048a9b4139f9cb74b9faad Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:18:53 +0800 Subject: [PATCH 18/30] update zips --- 0.1_official_module_with_invoker.zip | Bin 3233 -> 1919 bytes 0_official_module.zip | Bin 3130 -> 1853 bytes 10_invalid_yaml.zip | Bin 4064 -> 2124 bytes 1_basic_kfc.zip | Bin 1438 -> 1003 bytes 2.2_eselect_fix_port_type.zip | Bin 1001 -> 508 bytes 2.3_eselect_commands_with_placeholders.zip | Bin 1160 -> 586 bytes 2_eselect.zip | Bin 889 -> 452 bytes 3_basic_module.zip | Bin 1509 -> 861 bytes 4_mpi_module.zip | Bin 2225 -> 1217 bytes 5_mpi_module_using_env.zip | Bin 2033 -> 1131 bytes 6_hdi_module.zip | Bin 1318 -> 763 bytes 7.1_kfc_merge_files_add_aml_identifier.zip | Bin 1142 -> 695 bytes 7.2_kfc_merge_files_datatype_has_dicts.zip | Bin 1244 -> 746 bytes 7_kfc_merge_files.zip | Bin 968 -> 587 bytes 8_merge_files.zip | Bin 1218 -> 707 bytes 9_smart_reply_pytorch.zip | Bin 3078 -> 1771 bytes multiple_specs.zip | Bin 6125 -> 4117 bytes multiple_specs_subfolder.zip | Bin 6359 -> 4298 bytes one_spec.zip | Bin 4595 -> 3336 bytes 19 files changed, 0 insertions(+), 0 deletions(-) diff --git a/0.1_official_module_with_invoker.zip b/0.1_official_module_with_invoker.zip index 2c9945335dd0348bb1c32137790223e466d7a033..8176dc7f76096b36c6af4fe6d5ecdbd66ba3701b 100644 GIT binary patch delta 43 ycmZ1|`JZp|E|zU@6aWAK2mlIyeo)EUiy>kJ001%&0026Z5CS^{EiLU>lT89V ze_z6+xYcbC@UaEu`IdvN7lbG#!5P*-O`bdc+=Z&q^0f!&@ld7g&a z@U<2}DmOXpUFFj|-h2f+#qDomT802iya|SA12*T2kmdyFM%!ahJ&#+=zYKDWe?-## zfz6H3%%9Q7zLYo=CuGlkH-|&mMn3^@<$bmJ>^GuA1SLdoNz4=eVnX1fz~rJ;Ms>;W zmIdKc^~93mYItPdYO=z|AsqJYC&DSPtAuqqI`?vT8xUB4)9`X=!GAxzOYtNg(INH` z3=!Ps#Sp+cIFA+X!UkK(hZsU;e=!Z~y};(eIApB5TrJ}g!V5aty4e2oW#l@=*VDWQ zBXCMcoE?MX_><{Ac#9s&)SW&9+?>WDBGRz{){-s#>OXxeZ{_F$;Zv)J0|!n zmLtPILB+0s$s6RV{bCiDo_T<%PLU&dhw!?siofG{3L26t6E4lww zaxp)@Qv2_vHqs+ed*KP%%ly%1G<;`Wia{iS&xq0^0@nikfBada-i|}K! zB6SRN4qf8ny)pQCofu`ke>i-eQlb@#%Sds-r4i{PlWgmxZ*aj?R;z^Apw?P#`K~X8 z4aRk?qx$(M*$%18##WLyRy)1*NzJn7U_px4(X{5ugOG;*zFfVl-q5fK$_Lb|%RdU> z&V+|xvg+G1;c`hKjh6L3a}JHwe_>i4K|OJ+Rb*Yx8x*Pv#7Vi9e=cxCSs75M!y6R0 zMCxD82^1!>rIoV7hrjb6VZiRT1EYwUnrt`!3E7%7UvW zjajSAVeXX5#mHghd}z6@vYSpjUmhO|PJgcup)p5SvzJ{JU-eLURVstW(xQ*?Y-TIL zGrM#3;ON*5IUMYne>>*8Q(2!4ix8t;(+$vLQx4a@B)#*ZVlQ!J9Zd@>nq~>@h36FO zvg$5~S<3z>;zi+GA}wuAWj}x?5l+Nrx`p@bQQgr~bvM2}uK{VFV@Kl*r#QpM5xH5g z?+*QpyDKwylB8jT)6obYyZD*$KV%QuNnzz_oGa^m5Kr=cEH+MO5oQN(>LWbK1)f`_ zo^QW@-a%@6aWAK2mq;jeo&8%ifvm2000ya001kK0Rk)nEiIER0zZG5 z6xX^70zP)2Jl}D!O+|=e5}aWzG~~JG&wZ#{EnjA=^O1*GcW&ZD=6 z+~!rql?mQ86-{Ah2562!_$O1=R~C;hxrNpvOFS~#`of)%3BPhZGTQ=aV{)Jy!8ck2 zsod;zaFtJQc>5LX9Cx^hX&D17@g^9e4cMG7LfRvsD{T)!4Lq(f|1!ua5=npeM>bbN zGk-!O`%>bmI3bVR_e(g0ZS?~XSKe2b&we91L{LKXj>J6SKPCh|3QR6qWmK2^?pP2$ zRZlD_uEt09ts!fC9K&JXej=O#yG~f=qjN8Zw*`R(I1ev}7X0_aI~Pyl5glS5!5G1H zUW@^3g7aA6E^M)te25`r7W03w-V1Clj6=q{%hfV1A-tfIt&8nXUq)_Hd;`r}FaoE9 z#Mv=Aj(?f%oww+rY>lK}tzMO_?2(DFkFwnn@6U*HXl#69*jMZ;mVDeyzGH$Zx&JUZmq(Kw|kPU&exZV~LeV?E>U%T%2u zX&lmYGNh+2erCXr*@JFYSb5&&$~qmjv%H@S%teI7(V8Us2v2f>=T>Q!+wY%uP?`sY zMfs&3yCwhjPZqnN@W(g~(&}%pmIfP-jf!ns1ONaO5C8xx00000000000001_fdG>M s0xSY8Et7@@DgvYgksKbA&;}|3iUyPX1~U!=00RK}0000g3jhEB0JvKtCjbBd diff --git a/10_invalid_yaml.zip b/10_invalid_yaml.zip index 481b2f2134cbc9fb4debd502a63549770f12d95a..17b63bc34d812e4b2150c6c1e718fa5bccaf4795 100644 GIT binary patch delta 130 zcmaDLe@0+J&17|6k&Ta*u}nV1D>7M>O@A^IclqQ!+yRpVc{+h|a+81Xh)lNQ6PTRI z%L7y+$EY*;A+Pr27(O}1d>~6|@;Y9&$+P)*CVv5nJOhj9@(WGw=9gnKW1Ae$FFE-E XADdW!H!B+h5U>H^entj{axf17Cxs<} delta 1607 zcmZvcc{G%39LLAZn6XSUb|VZ5$=sQ1E8%h{A|V+DF_}_nhav=l49{&+m7h=a0`b!3kMbFj}uV&=MGi<%vQd z5Mgl10$d0z6o&)k5DMj?HE^^U7&y*+J)jF7>iq~{cr<gvx~y4D=y z6x%&AzO3t_sAuPejFR}2H9K9zd9O>_6gRb{3z2L@RAGiZ-D}JTl;w?ukcak-x?B4T z%d`JnYVKI7dvXom?VMAE@9lpbt2W}f9F{UzR#m~u=5Ao@Pfw~lC)Pb_r0dXCvqZ0J z9S_zlN5=PE%P@!AWsr_jsMe-#MMkExPPv6SjK$_74YA}7?{c=56tRCL;?6=%W0JQi z3A*ar;N<4NaMO@}vm+z^h;E8U9Lhq~FfI1%dUsw>{7ec0s6>#C7CX&9i)!PW_|ZEH$m# z=n+v*xc}b3O{3leL7K~)^Mq|0AIX}4!%k>a-#ge&ihWff921meZ+L6?*dMj2DUVb4 z@SXChi?t$Xp`XiJFU%)&$GB01UuXBUx66r!q3h)#UrJNT-6^H#vP6zXQ>kooXV_)N*)kpR<)Cq=05Y8=_Q@rK zcd!}ixHoy;HZXrHVP#Y?K;~Y=Y|(njF?PsfyUo_XCEDH#4g7>HhbWk4pLyCXv50kh zsH8_bu2A_iFH)P_J`=;#q5FprS#oGVq!F|vj8bXC-b9$8Vcs4|bn zAwd~WV?O4=Y3~sG$O==FyBRInC_=-_dItlW8t=BblG~dv9_br@=n@{0ez%npo5~K_ z$6xdLlVoM1ZAw)&8s`>^3>JFdv!O~})i66(hFOahFHMLbJpGOv(_ z64btI_0siEEEbrRi$;uGJj}gHwkVpg2+B~?9zd=azrmlJjjQ%)3!I~qwDs)6Jv)KW?li24d45_R^_d)AuL?oRnMd)0&WJO(V8 zsMX$3U4%lOrxq+wf5OnqTU5MIU!zExM{b-VX0?uH!n;-+=WU;sl$J}|73980v0V>s z7>RdC2wfGFGnbNJG)t78=^qN`SO^Z_wMrFU3ZVNwddbxadrfvDywe64E|f5(d66OE zdv%SjX=M$c#(Fb+79IbJ^Gjx3Z{_2?Il-&nb5zO1Bs+l5}NNTf8 zIEN5{94UOryE@d%)aW#C-|hND_`$R_(L$fW%Gc)Aram(_>W{uuARi|rgt^A*PuPM1 zH1068F{mNs^aJ$>&{m*{K&72TV39bSy1M!l6qx3AK&yd?G!^zBFL;UsmkcN>3}A`m z-i^a`m~^t)_a~tc%i}OOu!zI})`-jhqsdW(9PkpkYg?7|2og}517a25cczg-*c~tM3kpSjL%|2xM(07)`1=llM?iod!Ve+BAdo23HuE1p CaitUh diff --git a/1_basic_kfc.zip b/1_basic_kfc.zip index 7fc017d1c53fb86577a313e482256ced6a54f465..6902c3392f581781c307087a599d5ba4acb2fe15 100644 GIT binary patch delta 43 xcmbQo{hEDq7Go&$WDZuj$#+>~Cp)uhF=a4L&SzERV`5-p=wV=B@MH!O3;+Q@2;%?% delta 107 zcmaFOK95^Ez?+#xgn@y9gJETLU4VxJ-xWhf1_oCq1_tSg(lSiCx*N@{88>oyGYewK rPflaj0xFp738b=|K!O1P{Vx`< diff --git a/2.2_eselect_fix_port_type.zip b/2.2_eselect_fix_port_type.zip index 94d842359dc272148fb26c60e90ba3c7f1c039c4..18555293abb333f864bf4163de539de7944474c7 100644 GIT binary patch delta 32 hcmaFK{)c(P6voNg%poGIYz#oa2!tU(dJ-du2LOT_1yTS2 delta 455 zcmeyv{E~gc6h=vA77+#p1`dXm)pY?K^Uuo#GBPmCV`5;?n7o%!vtCy>cH+UT76+cT z_f797By;cH_2tFd0501tB4Xcys%BhWarm51+suepx6S*y@@!{5@izJ|pL*8XwE5t6 zHrdx<$tynb9MJ5(xLQj4Kz!=ngNxLnZyh<-IiudbMObCg!CBkCusUCPqGchv{E_B) zsh-jc^Mc>adB9;h^WZLyTm|l1^*?b?pa%JI} z5qjc!Qpw-WY`p7!a%Q*D;k~`(PyLVnJ$HDk*=`f@@Z+D}@K2t^7^cO@B*Kg%bihQ`bM`J7#SFTGBGe%PL#H)*VXL}+TC~CK;X?+ z(aU#PCp`6Dy?PyIfol_k-44#63ztqQ9TGngDs=F}{&ZK*I+=AG+V2VstT)G`o(;dx z*A^FDw8q+ZqaMR@ouvz;Ryo#Br0oE74lH+$KR18nNk59=KB`XI67PT`ez z5s&na9PV8x?33YD&7oYUmQzqzY`*+h+)qt7PTc!1v@>rgGTCye7{bJfPJE67G zfzn5({5Uizb>k;~)4G@iFIy&7zxT?i&d*$ZH~)WklBnCp7dHjh>mRu{drPd?>a1SP zjW50Cd@A^Mis$-#tMwnsPj2j~JoK!?*y8?qaaMi%?nm;I&oicLF*1oTO delta 429 zcmX@Y{F7}%4x=P9iwFY)0|&#(>bd}?sr==Zj0_BAObiSX6Qw2Vb#+q%4f9$I1l~;i zad=v13H$VEdcI3UI+YY-g_nMK$hzi6-03)_kH6nY`W0~AJ$L3^1>4g%(l1XwTJ3gz znYqO5O$-H+HQ{{H2U^6e?>#U+mU6~e*o2j4Y#7}sB(Jwsy6#|X#lIUBW@giDH^IacyIANf$x(0%5$pnkt- z^wWn;2A!UvVmHk_7bP#7eS7t~$O=BDEi%3GW{&rM_+LI!ucv!rS)4UmYm}d>6f)0Gd^Yh9w%3mR zzhHh$>rDLYh@*;cb@~=`+J2IY+%~Z@XVvxk=*;Zzvy%7EFH%oWUH+Tt{R{r1kJs&$ z-o9nagzd*pJrbXs#ptHR$RxsyBY=Uy4g*UXvlu7JNJ!}F26(fwfkc^runS1v1V#k| F0|3?zuM_|P diff --git a/3_basic_module.zip b/3_basic_module.zip index 3375019ded7c84647302f9b439bbebad8dc06d52..e65ee95baab89c6c01edb2f020c5e8668eaad6e4 100644 GIT binary patch delta 32 hcmaFLeV1*+dZx+GS!Ri_vM~Sw6A;b<(rcMOJOG^c2DtzL delta 625 zcmcc1_LO_WdL~I`77+#p1`dXm)pY@N{JRT&FfuT_WM*JcnykXCT(7I!8+1EM#8IGj z{`wW$_q;h5Co<8^B~?(&hsWiU(!nd=uDsjwt@oYO<^^{sokFH9`V&5E(u@$}+lT^D~N?N<&rix{`a-qBnu zT+!eBjN{FNH9c0R@A%FVTv%SdGwx-w664MHS{B)tgcIfGFtW&J?3137_F~Q-H^wOk znYZ>T9^;eT%x!1k-za*thB?8;g>nAcZ^k#49`jx4l`g5uUGck^qvRjsx{4Q5n*Hlr z*y3ELWt8YFt*A(z!lSp#Hr+m6yw3kt{v4T2R*bfr#k*Y<-t1VuL|5$jnd)wczO{*`>>=VVReoE#NU}5AJV^ZeBm!U8_vncTHjk`arQyxv0wLlzD@~@J@=q$Rh62X zeMA1N>HzP_>zQV0F*1oT<47aGlmi1x8rL#SR%KR_(A5p_W@Q5jGXvo(ApMjD!~+09 C)DV;a diff --git a/4_mpi_module.zip b/4_mpi_module.zip index d4d6305883d26bf5a123ad0cdc163e206ed3983d..2eca58d2b4c729cb4db880542dbfb1ea47d41288 100644 GIT binary patch delta 43 scmdlec#v~K!)6thx6G4cIpi42CQg(W3-D%TV*mmsAe;iE#aTc+01g`nr2qf` delta 906 zcmV;519kkt39%87fDx&CeozL~E)r-1006oN00175ksksrEs?N2e};APLRY=SRfWon zTA(d60L40VhH)&R6WnU2YhQ5PO?6!hj?)S|O|UMyek5=S7e+t|wLAEN)(Ndjm=&{P zp81VQxU53QtuQ_w{v>>GPCig;3n6?#<|_@{BJ&7L!NqztU;;yU376>MCIr0!ui*v7 zcu}O2Pcbx;C9tZ3e;eDYGp%aTM4&UsMZE#v;_xmw3wY2q5Hy!~hZ1=7=xsc5kxeVy zmL-!;N1ARRvr?w_V6^pc-wNJ>>rMC~k6wCV$fshSLE!5KnwN*!SIT397N((+2!>fI zt*0su4u9+WaD(0v0WcPGi;ZvuzzR^^39D5{Z49Bp?e4Yxf9_alW06rD76=5o#%hDs z3rys}v&NP1RY@~}TROOoRw{sJ+?VkFzuw}-KXB>$N@%!3*1;R+IqRg0CfB^%Q_0)t z-=Z|5tscxrK`y-&s)>dQYeu~(15>F7(@26`~ViB-1PVLDt#h)K?^*tr~YS9F*NMe@9iZOf?91Oo}S%x5#ww5BvBj znhqQJxR2RxMC0}$@t^6QWb@pGUOilBesCdD7N>s2IBT>YDdw}`7MbX1QiEdSoq|Ig z1EJDh1R&9Wc$lQ?YYY1{JMrz8m87q_T&pqQZU~?Sv7Aw@fLNdw!v1LmAx2 zT;cIF0iKARE{l`m_2H2)`{-aCuAP(4L__t=xn#}>o~M=SPEX_C#QbE~K3&IDMT3&^ zOoq)%ck*^qm`$1&X5;D_lI3|^B@_5R{;rvCF~_?Eeoc13ov8CU!6D+mFq*@?#c|wY z@wCU{xX1EokLB1SjZgrmw{(Ni6m7xR*>ACS_X82Bdwx&`)GiWe0{{TJ2LJ#blYRs( g0xd0*VFW4y8U&M#1SSpx00RKv0002H2LJ#700GpnGynhq diff --git a/5_mpi_module_using_env.zip b/5_mpi_module_using_env.zip index 6a56b4c3c069baecd30d21180fc12c3e0b9cce5c..2bbdf14ec24792e91a281beac00607f327e274f7 100644 GIT binary patch delta 42 rcmey!|C(b$*XCW!&CHW0v&&76X4eu6@MdLW00Jf;TmhulGJ|*k9N!6s delta 851 zcmV-Z1FZb(2=Nb)iV>-Meo&H3uDI#~0055$001bHECeZkEiHvqO>f&U488kT@K#_* zoPO+N48yjz+X5_Yuok@(!K%r$t<4q%Nlur2{P$6klO}D7p5jn^PmkoIMAy!!>|30c zsJ*Hb+9CtcqC;nd!~!}cEjg-uE~%SPRVj&+5} zm>*?+Wl~;$R-%(u86OY-a()0O3{+$x(B~Y!CXg0|M-Uoj^XZTi6v8XGLJxO=^bS11 z0dpMW>Etp}i?#q!mT+f#eM-7gbxd>yrK(oo8yvos6d@m|0!|&bxWpD@MD#Wuxu~X5 zZmm+Zj-pIAh?#2BdoW}@+&4-#;Cd7OF`{q1GK?vIg%=R?xG6{@=@`_qXq#yn#l5d;Le#*#tn z6(;fEMePc>)vX!9cRpCeC^x_h=?i%OySF&|0$08-6~Q%%4&FE~Mc29*a`n3%m%NSm z23vD~MzRlz3TV7H#bm$G7Es zFFD@2Cg3#hW0hCA(k3 z$(Dq{O1mmjBRUmUGJT3)96fw`^)=gP?Z%A_2WL0JaaXL+HNsM~s*L{4GwS{0IbO!l z<3T>1W42k*`1-K+zM|;7XFVY=ns^d)!j*T@1KwJZV zrPI3zz@|Tc*t8Ubq1rQk5BPA1Eq7nPv{GFsbji~<+9Yl!H9q2Wi1{~y&9$=)`w_>_BaZhYPM$}cY$K8{LUQ^_ z6>M2!oxI5Y15ir?1QY-O00;n;h<;G9j(-CYse67H+`&j|Kn$D3cxpHv%m! dlK})O0Fq0%RiwFY)0|&#(>bijYX?#wL85tNdm>C%4Cf6{@*X!!`PCA`;+d#ne z`>(E_4AFgiMVc0|_AFqVb$Mm z^PA;#WKAj!*DB^|G4%HZxw!ILEVfv3!E0^P?Urq(U1qalP8fw>I3IcE!12Ea)h~Z# z`rLN@E&HRCru+x1_O04JwWqLtcnL+gBwW{z2DV&O4M?Od3ru5bd)K4#bKBueq!&2kFlB=S%n)W3vV*pK#PPy;@UZt8o%rSZo!cANnD3qH6ZjfG_+R?Wd>2tC!^q z?^ZQ@ZqfPt>YH@Ir;~qd{KY*vkZGD0Ba;X-j>rT?F$^qe3}l*I%OoeEs~h0W$_5f< N2EqqG+JFVb0|1ER;nx5F diff --git a/7.1_kfc_merge_files_add_aml_identifier.zip b/7.1_kfc_merge_files_add_aml_identifier.zip index 5fb9efb7ddc5a39b4e96b167dfa32a9ceae84669..ddfdbc4ca7b44031785cfd932b0f5a216f8981f9 100644 GIT binary patch delta 38 tcmeyyv7L3o)h3{bG7@g?Kr0wzm7W(H;kNuXKo%pe&6$F~}P diff --git a/7.2_kfc_merge_files_datatype_has_dicts.zip b/7.2_kfc_merge_files_datatype_has_dicts.zip index 74c0f4e6d98f4cf88ee40c89f9d5d6f0f5306797..59bd676a385e4730d661f9ad50723e0f039f89f5 100644 GIT binary patch delta 42 rcmcb^`HFSI6hx`6f_6Zl*h85la47#IvEN^4C#$HAnlyYZSE#E5Dx%3pb5+X delta 97 zcmX@ja)NzAo#4vqx`5=_TP1%oFfeRmWMGh)e1TDPvMv(`ldkT>HNQ8OH8WyS!^NZx hl%M>TQHyCgbiiWS@{{oj0_Bum>3uoCigHYrs?X|2A=M_ZNRhV zx%Lmn?DczRn|0v~*UB-l?6Tws?g?%9$KW}0l=PR6cn(0`gMry}Z@hHYQMsJ;-ZC?}@_1Nudz02F4 z?rAZV!Q5-2!WN1g%eQAX;CsF*Xz9PV*Eejka;?@cR7~tjc)h4n;#l(k8>x|Zo_wse ze~p?fqiCdVcyMsIi|x z^TYGg+s6-o&re^Ww9nC}!&hapm*_n!tzo;$LjDFRUcr=1$!#=^r|~?VE~cB=-TZF0 zoY;d#+DFYM0xZp`r7kHdrLxo_q;$h5DyU%m@Q`n#qetd3etZWL6m$O=(vj<&Lz1bA(sQS$@+9 zdtq){fy(IarV&i3Z_2L?_>G1<#pVZ|YHD9@5T_=;WhE33BeUp*WGDLQURDAJITW`8CSA1qH>ufq!(u*2gz=H8B@v$)UG%0A6y`-z@G}boE;<{tERVwLI z7!2<73yPhR8GGjCisorylo%$K-1HSt2WT3*eL=t1<&|gl2WepsrWs&0 zOu$7-xqhK%`0tpnZGvap+79DO@aV0W?qS1djz@02Xq z-V0}p{!UfW)*>@3rnx45D447}2~S>s24(57pTK-Xo~sn|2@{%wz~1$}-~gGz0lu-O zMl(V8Zc#E5w}m`)6$zfW$7g$bnTgUMg=UL*7SBmm<#dLp-F--TN2(p>R?XJ&w9XxA zaQ{(#KP9*+36{bzdQKCNuVq37cihR2$wVLQi;}-Yr4!c13G2jfQ<!NsFn-n6=~X-TXQ&@rC;2g>Le3F#A0A#BLUbxT7pb=xH{;$_&7 zN1=OY!;5TG+=Te+-h?#8O^6R|#~Zk%R6x!ll>2^g5XeA^R9wDY} z{|B=<1w;W2`wixEe*^#kDH8wyD3gi?CzD+U5CSbNlWhhn0{#h+92k>r1tbKUHD#ET%5z$=}69HeccT$TfKhlgQ+oqFR&v#k81aFirMjm74q-$ZTMqEH3WK kG>2nyoVY*JOU}s$#WchMyjj^8fPfVUYZw_An)yIH0Os!(L;wH) delta 210 zcmbQL@K#?sz?+#xgn@y9gW-L4VZb}*ZoW7s28J3|1_rsw>-glEbagjcWiV~zYG4-H z2~z?+qg0SH)ua5EzV10z3(2LPI< B9Wwv` delta 237 zcmX@5c->Gsz?+#xgn@y9gJEWCVZd)@^CgK)3=DOw3=A5R4=~A0_TcAb($(GQlFhV{ zD}qaKXLeygy}(`dFct=em;4M2=3qtrTrxmKn^$v1uxyUv+RP$|X_g$nIZ(-DMt&`( z(38oYee!()rO9^%Irvx@SQw-j L85nMGGXMbqCDRXX delta 128 zcmeB>`m8+RjgY{$@_?4D>l>n37#LpgGcYJIOuoRQ#H6dcxt2Yag^8JEvK)`pCPo!* z1x%F;aImED5lr7?2_7w`TGq)fJoZeJxhA*rcrxAM2AZkG$I8IUkj2QrP%Hq_2LKbI BAC&+A From a8c083830258dc4352684c4d98c9c1b73bee8b8a Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:28:19 +0800 Subject: [PATCH 19/30] fix bugs in kfc --- 7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml index b861c7b..4a4bf64 100644 --- a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml +++ b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml @@ -6,8 +6,8 @@ inputs: type: LocalPath: openapi_schema_validator: - type: string - pattern: "^file://.*$" + type: string + pattern: "^file://.*$" - name: merge_count type: Integer default: '100' @@ -17,8 +17,8 @@ outputs: type: LocalPath: openapi_schema_validator: - type: string - pattern: "^file://.*$" + type: string + pattern: "^file://.*$" implementation: container: image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 From 256b29ac2a9dd1ea97b249ea01c91fc63a3aa9ec Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:34:34 +0800 Subject: [PATCH 20/30] add port types --- .../kfc.yaml | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml index 4a4bf64..af80e69 100644 --- a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml +++ b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml @@ -2,28 +2,58 @@ amlIdentifier: moduleName: Merge every n files together cdd3b0ba version: 0.0.1 inputs: -- name: InputFolder +- name: InputFolder with single simple type + type: String +- name: InputFolder with single dict type type: LocalPath: openapi_schema_validator: type: string pattern: "^file://.*$" +- name: InputFolder with multiple dict types + type: + - LocalPath: + openapi_schema_validator: + type: string + pattern: "^file://.*$" + - RemotePath: + openapi_schema_validator: + type: string + pattern: "^http://.*$" +- name: InputFolder with merged type + type: + - LocalPath: + openapi_schema_validator: + type: string + pattern: "^file://.*$" + - String +- name: InputFolder with multiple simple types + type: + - DateTime + - String - name: merge_count type: Integer default: '100' optional: true outputs: -- name: OutputFolder +- name: OutputFolder with dict type type: LocalPath: openapi_schema_validator: type: string pattern: "^file://.*$" +- name: OutputFolder with simple type + type: String implementation: container: image: mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04 command: [python, merge.py] args: - - inputPath: InputFolder - - outputPath: OutputFolder + - inputPath: InputFolder with single simple type + - inputPath: InputFolder with single dict type + - inputPath: InputFolder with multiple dict types + - inputPath: InputFolder with merged type + - inputPath: InputFolder with multiple simple types + - outputPath: OutputFolder with dict type + - outputPath: OutputFolder with simple type - inputValue: merge_count From 6791ba79047e493e3dc2f4e80cac3d1c6b423eed Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:58:54 +0800 Subject: [PATCH 21/30] update build_zip.py --- build_zip.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/build_zip.py b/build_zip.py index cc5e79d..4f6b57a 100644 --- a/build_zip.py +++ b/build_zip.py @@ -12,8 +12,39 @@ def create_zip(path): zipf.write(os.path.join(root, f)) +def make_zipfile(zip_file_path, folder_or_file_to_zip, exclude_function=None): + """Create an archive with exclusive files or directories. Adapted from shutil._make_zipfile. + + :param zip_file_path: Path of zip file to create. + :param folder_or_file_to_zip: Directory or file that will be zipped. + :param exclude_function: Function of exclude files or directories + """ + with ZipFile(zip_file_path, "w") as zf: + if os.path.isfile(folder_or_file_to_zip): + zf.write(folder_or_file_to_zip, os.path.basename(folder_or_file_to_zip)) + else: + for dirpath, dirnames, filenames in os.walk(folder_or_file_to_zip): + relative_dirpath = os.path.relpath(dirpath, folder_or_file_to_zip) + for name in sorted(dirnames): + full_path = os.path.normpath(os.path.join(dirpath, name)) + relative_path = os.path.normpath(os.path.join(relative_dirpath, name)) + if exclude_function and exclude_function(full_path): + continue + zf.write(full_path, relative_path) + for name in filenames: + full_path = os.path.normpath(os.path.join(dirpath, name)) + relative_path = os.path.normpath(os.path.join(relative_dirpath, name)) + if exclude_function and exclude_function(full_path): + continue + if os.path.isfile(full_path): + zf.write(full_path, relative_path) + + if __name__ == '__main__': for p in Path('.').iterdir(): if p.is_dir(): print(f'Processing {p} ...') - create_zip(p) + make_zipfile( + zip_file_path=str(p) + '.zip', + folder_or_file_to_zip=p, + ) From 94f58d424cd243d944736b52ea6d57a3dac5aa2b Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:59:06 +0800 Subject: [PATCH 22/30] add zip --- 0.1_official_module_with_invoker.zip | Bin 1919 -> 5249 bytes 0_official_module.zip | Bin 1853 -> 5219 bytes 10_invalid_yaml.zip | Bin 2124 -> 5688 bytes 1_basic_kfc.zip | Bin 1003 -> 1751 bytes 2.2_eselect_fix_port_type.zip | Bin 508 -> 789 bytes 2.3_eselect_commands_with_placeholders.zip | Bin 586 -> 888 bytes 2_eselect.zip | Bin 452 -> 749 bytes 3_basic_module.zip | Bin 861 -> 1297 bytes 4_mpi_module.zip | Bin 1217 -> 2270 bytes 5_mpi_module_using_env.zip | Bin 1131 -> 1971 bytes 6_hdi_module.zip | Bin 763 -> 1164 bytes 7.1_kfc_merge_files_add_aml_identifier.zip | Bin 695 -> 745 bytes 7.2_kfc_merge_files_datatype_has_dicts.zip | Bin 746 -> 1882 bytes 7_kfc_merge_files.zip | Bin 587 -> 705 bytes 8_merge_files.zip | Bin 707 -> 938 bytes 9_smart_reply_pytorch.zip | Bin 1771 -> 5734 bytes multiple_specs.zip | Bin 4117 -> 15968 bytes multiple_specs_subfolder.zip | Bin 4298 -> 16066 bytes no_spec.zip | Bin 2075 -> 10267 bytes one_spec.zip | Bin 3336 -> 14461 bytes 20 files changed, 0 insertions(+), 0 deletions(-) diff --git a/0.1_official_module_with_invoker.zip b/0.1_official_module_with_invoker.zip index 8176dc7f76096b36c6af4fe6d5ecdbd66ba3701b..1db15329a27110d653baffb61a1cf7d3c23d2bdc 100644 GIT binary patch literal 5249 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 b`?wnaEBH^+5djwv{GG&myj{my`^WWnDsy#$ diff --git a/0_official_module.zip b/0_official_module.zip index 3d21850bce1e7ade177740258d2a5c8da76eb27b..096ffc71d6303c189ab44f320a7189c685075503 100644 GIT binary patch literal 5219 zcmeHLL66)t6y8$cFeea|xIT%)Y^6=uZBd0rTBNdV(Nb+0?N*ggRYjhRXU1(3N4B%O z)2bER5O@9o7yb=5PW%e~0N=Bn>|}P@0^)*1s_i6>{rukN?>&Fc`2N**uWj-5%Zpdz z-+%l1yUEq9E&dyzO;xA*nKWs=RAsG=Bil@BqjPEPplw;&!C)|zGcrxJo$Im`)pSIK zvTlc*Dy44R{;geH*GB`wrDjxVM{Q5v#_dMB##96U9PU?UOUJsFo%tQIZpwD;(x&0o zH%VjKCfr_6&xCT@tq<|{I=nr6@aUWScaO72caKjFzj;9WG~7*h(_6zBiL#lGTvhW- z&t@uDqR2`;Z3?+9%-qIEqL&36^R4v7KHVgQPyG0J_X+L8a=mm5T@5eV_dnCKTBe#$%oa2#T zrELmF!je2!j!s3~@_VNn@3+M#QTB4+?c4o1$kS&sa8dT2yt!!ltwcx!W`YUfRz)G}vBEiLpJIZX?s zOCde-9$QN>Mw%I2k{}KhYm*L)gsWDbILtPpzGo2b z9c5(h;3ZyhDT}@n_55Q1JQFlcBze%~v@?F7i>9nB`@QnEohrN?s~i;*ll1JiBRMJC z0Asv<5<+=HVl!TZ(#X>UL-(|~2&xV82>6#x*|$V~d>8n=LJNkW?}lG(T@}kX330vI zWQW8=pCTLLdQAiKcL-G%Mv3&yXAFKsQQ)=!xN;h;T0iehAagu>@CeFux8i(6d+BZm z>ybGB8{tH=Y~XFt+1H0Rkp&329$pBoac>XrP4W1g;_`)L<6;q*coZH`#se+~zT|Sf zK`Ob1*S;$+y+ylSAi1ziCG#$@rB5MDp?!WK4~PsXTS{5D4xQa#aeCs1L1JrDP&6YDER%Q)=cuw@s;A!nG-Ghy-(2`{5o5xd_hK^;Z~Z9{AZ6M zT9Hwhp${e!JhF}RVM9zUu8{@-t%&NeERk%RT>cAYSC*cQCNws>7IRd|XpnvH?EeR# zovQ!A?IqH`$XnE)|9SiGl>|;JV(o=ufwF;wYm=>QjTH*pW?!fHJpvnMls6a|$`=ce zOM0cphV_wcMt8f8>+7%9a$lCM%Aub5ezz!fYGEy$#r|`lzsY!c!|cm-<)Dv)TE)SysSb2CQ}e(~q6s9}9nCW8uoQFb17&W~QsqWlJ#${o z#sku)+;xOAgDlEg-PqmxJiVDTlcsVF^y=sE-JCRaP<=Cj_}jmk-bz1@9TTcm z-S%L@#8?t6gPH@CBrgEB%98-A-QSM_JbE2Y*!}^w{OK}2BxSr=J3j_P3vFE*Zo~1` z%T)FtiBlzv!v4m=Hs!_asFivh(m#(}Zt~vn=_iEC6J79~C-&-nEZpKk<1&`qF(i&n zoK7YZkYLA!5)W_vut$6p8xeNMjhZ~h6_j!kH{`@ik)&11oeR;{n{{=x7{uydwfIJ9 z8zbe|ptX1r0y85pZG`cCD<}OZAY?A|TZqe}vmVoCl?Q|a#x~&-KmyUykEo^fnk#Qp zIl*pw-0qu9I^7l*ccZ`EX4lhDn>C-0AuwZ&SfSnqX8FR{E46F5cdTv?VEq1)1s3#| zdbXd50>MLajoOTEKi`Drf1W|U9)Rf_=}|bT^EPqhKS+5HXHA8}I0`AgB3yar+SS*8 z(c>?DeEs}A{~y1s;QQX{xJ}<5xHn%vfBz%C4PH)l|21NK|GoFQ(>wV062HHG#7}<$ Dz%QjM literal 1853 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 I{bDoyH+xF<`2YX_ literal 2124 zcmWIWW@Zs#U|`^25Z_uA;N9}@stu553&avYY-kXlnOByWlbI420B+;dj=F%XNE6Q*76t|#VFm^TY&Pbnl;)(y7Z;=^>w%oGHSBiZ zZ8L$|@8K_)y?(x1`*)gJbV6g!E|2CtI$}(!y?b0L13j~ZpTD+VQZsQy_ieVi$tKU| z%v{*^L{MwJh0PNMU2TaMcU8JnL=(Jb9n=%jxqNEHp<^?Jf&e*nI7WpyJZ;`#9>`w9fCqDkXbXN1nkB>i| z{F-GD877w65x+Jz#WdCEWBlYfnJvG>)aLzKe5pX+xK?B1@B2Hv?422pR)PSGRbdF_qQ=mz4&FB@js7q7?1^upS zw%Pha*LvX&^_i|BU2~r-u8!oaIk|9w==R+jthvIDx=v5`z5B5y<5iYb;HA@2F$bDH zYX975=<|ybEB;G|7SU$$PhX&O5$3vFg>o ztfU+K5~ue^n6vpCyC{6Kg@N1g;?m!DN#Ec-Hyx@OrIr zJ9bo_rPE$Ap=NLO_J&nCw|lOJd;i^8S>JbWuKFhH8~?S%^(TM#63co2);O(xy;f%S zWJ$BjF~a|~W~@=?ERSP5R`E{wh5w4;&?LjeMNbq8%KqwDI4%3Y`aU9d^UMX++cjqP z-7cHAtB+;=uG8t|yJmK3Id)CbeO$RmA#&NSnE>{{=5JG zYjbqI(a|u8wDT`Tp3I&Zba3uBlhmRpxi_mP?RPmQnfy`g%#G#1^ZL%%`!WK*8CzP)EEariHH<#~xb0>YkbBJ($mNv$ zw3xAy$Iat<4%?Ty1D!W+Y3T*jX9QUbIPKc4v*epH2j`sEJFl&u5+0juy}{4@w&bMa z1wXp=rWvZRDLTzEGhk^qj5)b%J@>=83ajFCV%+!0DlK_>)2T%L#*z8Fw+vRZ9^A#` ze@%0pdR%$EVPfsu?TbwxKic_A;;n|FZnvnA)j{F91-*U~CfI!zxzuKm7bR7<(pt|^ zfd6otE!V?D9{x>%#loM~FXqggHG6{mu|D;J(<@u%)Uhb~77G;}nlZa;nea*z+I#~s3`XSj`m#3Z^==+TBS$_yBr=wS}^A0!e3yjejJ P&cFtQ`xzM+%E3GU*y&L7 diff --git a/1_basic_kfc.zip b/1_basic_kfc.zip index 6902c3392f581781c307087a599d5ba4acb2fe15..dbeb342341b3eafdbb4c7e7c986aa2be6b86246c 100644 GIT binary patch literal 1751 zcmah~&2HO95LV;12No@Q$gzhhdY}x5v=S#SK)^*>z-V0qj^GwX0Ye~G2@w_tK0kPw#%t>W>t)9-Z)KNs8R)Ol8;Z5>2*OZyz0*S=o z!I(a~LFNh?X-Ir8QxF6|q3Ki;xw#*2MN22L#T)n$Xj58Tz0|26Iuk0jG0|{0y<*%9 zHypxqm)IVkotnket>;u&v?DS$hg+oGamu4ZGxVJy@_C##i9#1I`ri{MgW-*M}ubo0s zldUVcOk+#hN<2sER%S3Kt@EJZJ&Z0WK2%a!9zaKer85l>c#TD8ZskGg7M(Uygd9l^ zTcQ6|!IjF(lG`0`b@V`XN0L}E@XEs6M#ows#2Z~Vt`4kKyfMT0IEW9cHO!Wj0o8(z ziq$%eQ%XxPGu#S0f;;uxCAsWIq52Rd+m`RwEx3LKv=hNBaI5F+O2W`|asktT*WAFR z-E|J!PKOl1mWHy-b9*x8xhr{|3p!WwJoX)L!=3lv z4*sI}eDLqLcI57ge!+dWg}uSF;PRRF7|5z&E+eROecF zH`li%F}(er=9M$weo|CEJN=_@vf0u9X3rLH6V zu=c7{?}~?er!Yuv)%v*9I^?muJcCWZng=N(%H?=@D06TLOM79HiQ*^>IWCve+chxN>B8@4!#XI5{17M{!XV7c{% zzJxxRjbChnzHHOD_r`VWugTIMrq;1G-a2yn=m;-Szh3lGx?aYpXJ2q^otN+PB^D47<5` zgJA1z-5Q2#>?iN8=iiX}?4gr-`cdgR+lS$4jeG4kWIWZ}lVLU0skU3r_k2Xo*43_4 zTV*dU3U8T|uKU^G-=d830ww3v^DdO>6rK?IAv)V*|CfVr%?u|P?{uH%e(OU0asxI0 zh9##bd^+MXC2-=jzwFlE7#+{_6u-~Wc^+&x+sHivi5x^2{T%Jrt` zpKa$?Rqa)pHs#!>`^BdhzE>zPm|IX-tU1}z=?!PdgM*n(n_nsSNuJc*=@i9VuDLXn zZK+JS_R_#xUYg5(E_2dRiB+5Z{O{Li6EwwEYt%6Xcr!AIFyqcjz*q)@C5<2oXU0M{ n23tyj7{b7?q%i}SevpkpN;d)CtZX2KOhDKJq&bJn3pg$w3R+7B7tvM+ZzOA# zU(XBEDz)@lbxSFB=3c0gt33?&KXWapuhO)aw$!C$oI6(J_2%UC;_T%$j{D7@pI^gm Xt}!fiy?Om6=uY^l`2U+1Kg<3CcL3_d literal 508 zcmWIWW@Zs#U|`^2nA%Ynu=Y=LpC2Ow!)zu71~s6lk)Ba}YH?~#YH~?@T4qIjL4Hw5 zd`V?NsyVCm*0+C7T*z!L2o{W1V7Ga| zbuh7E!OBZ71tfdQA{^GPHPd1cHZgkUxKr#`!@rL#=AG9SJw;4T9pp`%qUt(t>E1w- z`N2DH#hGS5Jn6mY*@D>p%qx@i?RUR)WfycwJY_8P^Zp*y;^X_fyl&d;&N^B;HD@O0 zgttQ7OEw()ynOAer4whiH|)5(z^KdcQ{TzjH80jZxa@B;!P?Ps!qK4J^1qG+{CJt& z9{S>O;!(+{r1qLKI(JXFs7-s_+I?+?a`C&qz@lfX&Q#<-j{WKUvEW0&YF$0uqh~kT q{ALdDW@Hj!#vLcXXaR#IjUbA+7z*%aWdo^Z1i}y?JqZ}c3=9C7RoWr| diff --git a/2.3_eselect_commands_with_placeholders.zip b/2.3_eselect_commands_with_placeholders.zip index c7b04fa90e1f79fab44b489fe97c356012c07078..f6125d2e7930851c53c50dfc2d9e724977c0556d 100644 GIT binary patch literal 888 zcma)5&5G1O5T4yp4>@_*2dINE3fathjj-TFkO2vd%w<`mC#jh<_8;99H7qN5+ZXT+ zd^DfIv(??3bsP}vkfiJDkNWwlx>?O1oz3FzRZgk^6vE~WWoKccVP$U0auNYe?DwJI#{2dnCoD&c%r z!c7uqBh>JxQ@0b`a2<7)FJigG4CZ}qNX+B9D4NyD>Dm0>w&tNY6MvwKz2=HMt}{IX^cyF)yV! zzC5!eBfcOfF*!9OKPM%%s8~NYKczG$HNLnYHCeARF*m0-Xt&=H1A#Z6MK3c3op6-a zl2VasDS08~^3dB%oO^#tegntd{hJGmjyGx)JeBQFOTU&~Yb~)W|K!GZCP#NM%-J-h zDQg8=t%fvDXzzCI*(*IcKEHL$IOLJC;-T`cg)_F4o32~6`qi!sP18X3a~G_Fg{AV@ zUJLDdp}U2fdGY184WXS;73}Xa6(71dtoXU~vY}y5SxDmAwPspPwo(%G`+# zq|cvsN?ldIQnkGo80mAH$9YK>%{l!tV|Cf0vuA2mta4m(MS>qGdrv!h%Kl1)ozrDb zEPEta&PvQD6!R9y_$tLr~Wu|_@;(&&HpR^80@|J zQqKsRxz9QHbDw=xrDm6YfHxzP2s7>o1;!~DENKK$WJYg*H!B-RJ0lRL0_pR>6vMy( E04uWZBme*a diff --git a/2_eselect.zip b/2_eselect.zip index 5c63807c3aaffd0489e814643a727c01b9d27bec..eca5f07c4c7dcb1d2bd8e81da7ed9d1e7823a3f4 100644 GIT binary patch literal 749 zcmZ`%y=vn?5SH^-m~-a`m@90WrU7}A6kYiVTdWq-u(D4^!xy1YQjba{ak zd8d1fo87gsz+{D1+Hb!3`DUkFou19Ju-;z(lwY6!e*2Rw3-1rc(4)eN@2B^gy2}S{!8ZC`1Ijp6YN;n`36^FSLriQJwp;-bwGMHaTJ8%a2t6gYK&!0Qthj*3ZlKnhYgo2c<5HRz z`;0E{hNlBrxNRsh_=UBA+LFOhw8hRF$y()?`$4Fc8hb68@hSG?L8zXq-CgUExfIkE x>7K{7)TLzHcWgE-SCfG$Iq=a#pRzu|9RV;I(Qb$$`B2|opY-+7?3>_3E>+p+)v literal 452 zcmWIWW@Zs#U|`^2nA%Ynuyx~$EHg$1hGHfL1~H(hQG9A~YEEi$i9VFpt4z$zNe$eX z*J8kPcj6EB{*5v%x8~Hnzp4LT@P?n< zeVs`=&L!rYVp2%?aF->ALAWX>wfVfnIz`5%L zqfGB)hvznjj;d@qz+&`3tLZM|)U;*AhMX1d5eHAQKKErw%=mhyS&_T;$j6VIdRFV* zJ>*w!YkSaSu+lSB?526<+%Df<^CnNT$kU1$kJ#*vN3tzbU%}27 zVg2i2e$Q2l`rIVp-&;0YG^8p{vE7uj*x+}_`v2QD-Ft7^o@f8m@7yu}@2vMO%Dc72 zR-5N#W-8|QPCcq0;LXS+!i+ntfx!(1OBz8G_K*+oW@Q7(G6JCskj?_e6$1kRJtMlu diff --git a/3_basic_module.zip b/3_basic_module.zip index e65ee95baab89c6c01edb2f020c5e8668eaad6e4..7d064e1ff19320eebc0b0d2d957de66f888bf263 100644 GIT binary patch literal 1297 zcma)6-D(su6kglv#oUO{d(T}Jc4vPSk->_VMJTm(pwb&D)9lRI-PFksNv3setrWcQ z1$=|v_&`2@H$I0aNxN*N1v7+XPQLHt%%$ z_s%4!7|wJ9$`D2V7|16#&RVy=%u}MkW^?(!?g>hQ$j^jbOU2$phBTiTG&x=;AR>R zz-lagL=|uuet^jej(J@Zc+8sGS#S#0f~z&p9g+_VQ+4d^kv=05pgiJ6NkK=1u~7mT zsfL|V!)phXDnFtDF4zRqM4)38bIhxtjnZfwM;n!PY+^I`AZy)*5iRT!2B1{ZvC?Jm z`g3D&`z`Fcrs4|TBNOn#x{@@u!DJ_|1TT%UYV5q8F9UyywH~Un@zG^4bxvp9u0dA0 zDN<}UC{LjrCS2;qg;+WvLm6y(3*=NQ!Ijr7gCT|g#!za8++gXHnbG1EBWHfa(SiF5 zlwC(fGzo@FX(UTkeo_ literal 861 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&e6jY#g7ISe%(0pPQdjnv<#zq2g2XN{TA= z3Mx;Z(LJHB6{xXJ=h>r2r+k7t`p@|_puhjT@0l~*{o&gm1u--=EjqJD zh<8EI-Xn{?82ReyF$BQvo!U_sAn)ts_nnb};Tbang94_#$d1sfOw7&c4T{abVjxg+ ze*KN@`|doobKr>NV6;-4>*Bq1(Y^&;?<}juoA;-z*L?VR|MjwUp?sp9%Plq=pR7ph zeLZPeuKTpBae)H74X(}?7ppLSVeY+t#VcKGSx~ZC&+={`;SYR^Cl$m^Jbux%b;TUf z4LQ@_?s}l4`xmed~VB+j8GxW|uXi?Pl?ASA{n_mcP-x_GI(a^}U*YVyEN1d7OPryhx6#KUzQS~3Oku#cfX3u4i+)^s=lQg1 z(VeJe%&oyMR~2^t|MqL6)BnVPgR;yqVqf%OpHk zyz!A?u)8B5|yq)xPOVvfa`SRJuYVU*JUFN@IZEdahc>15m23zVRZXXS>UjMvi zdga>$w*9X@3+}PTT-i%Bl%(#;)Fy(;3l131PKk*`)g)Ip}Ok!YI(pZ6M7Dj>$@MdKL>0koFSwMO% H6Nm=@v4Cn8 diff --git a/4_mpi_module.zip b/4_mpi_module.zip index 2eca58d2b4c729cb4db880542dbfb1ea47d41288..838ca29b61b947a3c7025d5f5ae39121a7bef173 100644 GIT binary patch literal 2270 zcmai0&2HQ_5O$OPL6=@~>1}RqgO%267e*j-i?(*!8m^s1ZR8RJYg!sfbR<$BDZ87r z0Rr^U7w8-0(kJLs^wIx zGZIaNDK9^dqFL|hkKbR;KK<{(-+z6yvB7`usg?8KEm?@B4vz;pd6tDl!#3HMZAFGD zG%_>V>cSe;gglCxvh61_(5{+xT#2PZM(HXyGJ(^0|6-rTC?P1y_ zm;=>z4t&k7Dw$PayO!TbqpO{4YlK`l0gTsMBbX;1$-w)8a#*5)F=rB?6^2slD2vOu ze$ZDOYG)}SRCSCEmeP^{=78!_8m$^CBL~9KU1{^o3NB+3ksZMR7;bBHi^fR|;K7N~ zrtn17?Fi0k<0)s66W~PVQuyY1XYlApIB{JrHJqYo;7jW=;*Rx8w)}dHC0}{{3hQ=X zXB{I-p>nQG$78ByPSA3lSQWA^2Wt@ z+sXF8$wSpO>n?u6+%IU)OwKl~jNp4Rtw!)|-C;=j8i2h@Yby0ZcLoY^sg0yg$aJmE z%@B455SCP0M-dXyNN!2L(}XcJ)VHXgK1BXK-4Six70?$U3Jz!)TOSZHE2DaOJ2N!LWb>Wowj&z5 zH8Nv;OswGBK&mho0f_VuuRASRB;M%k*-Cw!T zv~qiE@*vrXyK@S=o9rfAAv9{%g{x?W`asz<;mO55sumTE?5uBM-V1{}8Io|As#RIVEPO_Uk7^wIy*=##=JkOl70?>XI%Kjydp0a+@! Ah5!Hn literal 1217 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 FJOE3>=2rj! diff --git a/6_hdi_module.zip b/6_hdi_module.zip index eaaa44d5915a99824dc07308fddc58a2119a82c0..1f047278ee35a3e2cb50553ab0b27922323eb61f 100644 GIT binary patch literal 1164 zcma)6O>fjN5DhJG$c0OPz}yPbHrwqnq6nl_#cC-;6!n6t$Ry6j5P!&?Af<&$l{j!l z;>5KV?)(*g0RMvnV`sOdrIkn&IT^nx5P*Y$w~vB*xAR(Q(OLVTHi}`9Q3{iTdaxfnW2+Om)#pawmlv(WK+C<*dY-m%4Dl6q52b7Rt03v}^_YQkeM&WZGgcFl>BE z^7kw`HWii^sBK4+D@Mlr3~~#T0p$R#P>T>KdBxhsE8$J!EATIKXTY2(`>N*yc~s&5VPZ?0|N=6X(}3$-9LJ)9 zJoo1@&tZ2LHuGFEq4IpQZ+k<%f%gfTkX7#=#I(|_wT<K_1UVg#e&>F zcG&+&`PKMvTiE>D{2nJ+^dGF+o3)*{zi?%qiJGfg(bPYB>*}S?*1cdlSdwttB4wrO zY0ac10uyf}%=*U=@y+uZIqeN&GmuU+*ZQcLW^!*sPhe_6iI*~=FX7jd3HRqkQuCjF*h#cz*gmKPLXdTq4P z;*-FiS2k~hZ_YYq*7y03%GH(ENv3yI=EK!5VZHmqAy0idU^~2-i%Bl%(#;j(0VXf(g>pPB`{=@u=xOD4gCLzz5}2znj6XT;Wm!T`Qpq&-Pv~?nL}6jUgD>D4 zEP{{VgLoD8K?JKZ&Y+9iNzp&`)!$cDtPbxTCA_|Uyew9qZhkE2%<_=Lpl?xhgEF1- z0s5g&(^NH3mR1@pOIR#mT9!sCTb9#21zMd~HasS%kiNZmlBUHz#Fx*P#rH>FfBig2 z5*7~ezNy3@ji!HDqYbK2=-HETb=3Hl;^gp#^8ma+KY)csY3w1m7Q+TTRCRr_&eoD_ z2+%8MbI3#{=Bct>41J!?fYZ%k$@f=I*XRixhK}A|yGrUphRq%|7F|{@+OS70ZNPT4 zsuQy0U(LEnuJcSa>@H5w{hvKubEa&%F4%L0HhvZXvt z<%Lm|cfD(ZsGK>LAEHO2kJqxtoH$2qI`u4@zZ564xTfsm{DsJ#lSlSxjI?zQXWbAs z&OU`*YtKhLwTgIR#^!&ekSLuCFRO?k1^N-G9KE34NOOcEY#cvbNiI literal 695 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&i?BY_4Y*pPiN*pPO2go*JK)nUh)^pO}&o zpO~8ypP7=HSCW~QnOdX|mewn%Jbgy@guYgw#yXv6j~<=!3GV1W?|sI%w?BNt*3f|d z{`0! z0(7fhCD3uD0VlH#8wl+Et^I78_u>=2ny&Hz93|FYgS;fYlie5aR)!Sp-#3Z3k*#XZ z%1U)((zkYF8kY8CT`iz4p&FFX$#KkaPTr>QTHu%$2Ufra3F&1SP_7AF|BmoueF zH#2E2d0{Ob^f0otn&b8C;Mwwvji+eOm>yE@AGo;M*)Bd{UuW&h2&VXeNqQl z9p@_BJ7xE-j?UF8R;+WlOE-Rqzj(d$;tjvHaa}s=EvBU!1yHuAVW#n~_O`8Fxej;~ET>G=eA+ oqaE3BY>@{snt@?SV<+*3!=f_4o0Sb@022`I0@BZcDT09k0O%eD$N&HU diff --git a/7.2_kfc_merge_files_datatype_has_dicts.zip b/7.2_kfc_merge_files_datatype_has_dicts.zip index 59bd676a385e4730d661f9ad50723e0f039f89f5..d287ef489110d597263f87db0937a0c64281f1d5 100644 GIT binary patch literal 1882 zcmcgtPm9w)6pyB9fZ6=yp6|za;fQPy>w(t@6S}+AtfiM{X+KT(8!qpO))(ia_=~AgZo+Pa2(Z9*?bvQkuT0ku&brmb>A^&~PS5WH5WSdHtVx5vp zu&r7v)w6YX+jn}=X{|IV){w9s&JNTCra$lQ9pCri4U?6NtHXRz3i0IH&ff0kn~iRs o`Z+&yqK#l*>vxw`qvLt!XDPk5S64i_L6@25?a)t>{9ey~0m$e+`v3p{ literal 746 zcmWIWW@Zs#U|`^2c-mMO;N9}@stu553&i?BY_4Y%pPiN*pPO2go*JK)nUh)^pORRT zSW;P#8lRB}*KrI{>cwjUiBQ*P(Y-gR)x zWHz^_YZ`W~Iqkb}O}|Z75^tH^=F?v%U)F6kIWu{=56g!)DzD0)Bx*9wQSXj>>ux#W z;9thASrcO|9)8y9k(u(gU$_5^h|t%o<=50#t=hA5pH=YeHwpT&TWS{h70vh+>E$i! zc9tn@_O3Y5NCtKJ6|4mvAv;dg&)svj_y5*KJ=ar$TxM*2TKh6+p^j|7W^?T}E$7TB zJb5Lu(=W~Bs!vi_yqe8jNNeY{W2<*peU8YxzR^>^b9Vctee?U5R5ouD{qRysgu8&W6fhAnFaQALbR$0i diff --git a/7_kfc_merge_files.zip b/7_kfc_merge_files.zip index 86c4122917dcb7db64e857cbc4b06530d0a4025a..8678b00659d598140258156f2a808be4a4119ff7 100644 GIT binary patch literal 705 zcmZ`%&1w`u5T0yQq|do{tJ^BLlUXAo1B*8ytid^X5ovmRYGxbzXXxn;j6xuggD>DI z*Iax6eG?zRH?exgU5uD&itg(A|Ej9>;k~0Q(YMbR)%xn!&lSBBKO{EjTgQ$ zI@|lc6FR1f(~SP$Sgj9cM~8PW5Dj>wo6B_VYWv&ke>*YxWZBK7q~~r!s`dQ`Ni(CP J>3%g!(r?zd%(nml literal 587 zcmWIWW@Zs#U|`^2SXo^c;N9}@stu553&c`DY#yJTmK>j(T9lp|pO%@ETC5Ld>lIX< zKBId=Un@{!ozAmIk52gncl4k4KI7ZlAHHF0Xh47edEYZ_}0yS6dnvJ>bAy~@PgoYH{PUPl}R_B_}AwM~4o zZ;aqf{)mWxFHc-utS0*z8R)CoI{m3iR}(OJuyNPwU8_$mQe@N@QDgeGY(rCPU}jXq zT^E~R21}ml``&I0y5=6|656c0D*9OXa&|6JhV^!5=goEb+h+4#XL5eMr?~F>HM3J^ zb!9COT%5+Zd|j@8<^vn;^g!+h0xOFq{Jb9=#{G+GAVx{lMeS{rdyF8JR?waYqv{^uS{F+AcAWcA_aj|Kg^{eZSa zQ({neLe|aVX=U{G?h%KG~J6mpj8{8>?1M_m?_U6dtS0h@%iIL z^8L%NZ=ZHXBex&A6gqD!Oq&{c&@ovJ@-jzdMIq3*pe|WcGmbGx!HsToVFRw^fi4Qc zkt_zU*JKyND+e0z98Cub3Q=JLR+nhkXvmcA8=+MUVGss~oPglV9p8@A25KCeWwH?^=T|6gORMF@IL+>L}5s3UAwwi6@xV`db+i@L7ns$Td4j6$|FuxC}~W6!(6|( zCPAoSW&lF6(oKw;;P%v*D^*qp8EY^mvS1}^aTrFk;K*+?s-}&e2H~V{Crw#0MFTjk zJG<6uA8t5#*6WF5n|AkoPMBS9w-~^Oq2NKgRjX6?zHeF8I>e4Z*L_V^cXoEi|9&CF o;C@|Qy5k1hpI(0>{opeiU0rhLwelIXG@YAv zZkEmLlL1234E=r6I=Waa76(NfI)MIeusL zr-^U++$%4=_gkK*&!5{`_;352gP+yT|Cq7UWOtg&ft}apH(&MTU%&B7+`NBJT;}ib z%1*f?pEKcp<|3E4i?TL9zb^J%VzK1w^Qp%}7w-=_F>k$1`gs%cIA7tk(@e(_HBvjS zibpZdF?#Ft?E0d4(U0A(N-ruq=IXs}&q~%X-PHkHkGIcflxQywT^aQMS9V0?+`ZFx zOfYcWP=ii=bxB< zyW@3%@gCp&J#ppr3(lJF{Kp#L&B!Fej5~P%V+;(IG=eDXi3QmVY*7v|fq`L3V*#ca YXbB*|o0Scuo(Tvi0BKoZvSDBV0PB+=mjD0& diff --git a/9_smart_reply_pytorch.zip b/9_smart_reply_pytorch.zip index 6a1a05ae738c274f4648c84f7e9d55f112205dc6..da29b6606f3be1bc7132397fa4e307deb74c6b3f 100644 GIT binary patch literal 5734 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 ABLDyZ literal 2075 zcmZ`)2{hDeAO2%Bwi#5Z*^zfcrH(##`m2sja(hPyhk5oTUqGJ|$%8m%@+KIH@>}2XG!{oxBYI zw%Am1e zN#g`*wE{s(WzaRr0ssrFMO_JL5>+qSc|sH{IPPT@w1q2uabKsuU;Y2gfR< z)=516-PVqQr{*_)Ig&)uEKzC|3hIJZ1%G&dV*_cpT0psnyUIk2k2Uh}R3Aj4|Fd9U zk`(I9Sby0&5CBXG0D#C(3;N@N1F#svNqlIr<0x)cODOV-qtGa42HKqH!Vo-gNyDNx zdepkcB6iv2Fi)~6Ys{j^(58C4>DvU1+NksRa&?%hin>Wpwz~Smk}Ji^s<~9Que?=G zyGvQJWPioS$ISWV#o7xs(g^k3Zi1W8c*k*DdzR0$qiyd`SKpZ_tuAvHUuAW{Vo+kH zCy*{i^*0LU>-q@u^N+;eoMrE2PNomGJT5{vdeuFWZm)GC;iu;cOMg$M>n7eu_F-R5 z>zsB2(a(MDRSv8eg-f(`X2#frFRe<(g?uR67~lSA5=M#)4GrGdQFa!#Tq>WKSKr)- zrx_DOS;xOFZNE;+{nXFuUf$m3!yM|AKV8hB;Atc0K2V#6x_^T2Hm}27+RI$3xs^e7 zwC!pY=pSPzwuojVg(=93rQMmB@+QL5dP%tdbJF`kROyQml;D(H|J$pSanp?5{>yH( z2XE($;Tq6G2(p%zy$;QC&BCd2*t@fZSU!RBHaj{w?AEiq=Gulu;wnl98$2mg^Dsw` z=kEln2KZ6fZvN^dB?-EyfirU;OTEE5BiLId$mg(`uWcUli<`>c%^8nrnZ5u`nW>k~ zoyl?w`3_NrA`w0#_~iJKl&=oODX1;5z9Av zwN3C>Pm1i6Qg1eh3Y54v6bR4QZVbkStZ7^1zzhAFtv z%kv^HwZaKDY#3SL*eK*{TAjWKDl^*L7C)IlUNvwXT)Y@&=#=m7I`wBxk- z4znzzoI?T`6)cCK-kqh!;-(KVdMjs+$bPPhC)YtCxAM}@4MI}M9?7?Sum1^8Y&tdP zf|=>@7{s=Z9Q!uQe@yPk3z18s#3}#dp34`{FW%z8KvJ{yFC5^09F@uahkr4dkrHmO z4t+S-E_4NI-{zZZf$H*KYf1H7vGqFdBn91us)-{tU}cQHyEAX7=1_2?;w0p%UpdEJ z9v}G&HDjV#cb=b}qtmBN=GRQ#WR5F#hY5JBcPteSO~oS;*$8t8d}RVW6b{&1mQ)Gn zYgD`*tn_*a8}=&{9PVgg1Qt&zbCZlPT{O|$q8r&EPF5id91UJN4Dk?4tNQ%C&?V(LIk&fRe~JzG_DQ%Al{;zWy#t$Unh*G+F>xf% zx%-u6a=i_a!PY6E&3V}MKTv-lj6)VHO28CwYv}`VcLEx-dZv6%Rd>hwCdG#yzl>_eC?@j;dpxVbGI{k`LsBFSu z4#%#KbC)m5Bbv<_d#GqRNP4#AW!=eJgD2=#DAMl(2`Wc)o9k3{>g+fl*`3UC9a^}k zK(K%YPNw1ebzsrNR$|Sk2;OO4w_4#`P{9H(eOnOwv@N!`b5rA5|HKSeQy5q8>$CAu zdS`y!MLkJ_k~q*v4o)$y|DT@wU-_?76!RVaCrf{(|6Mlyn+yO&G1EWMe@O9H{$FMM c!T-$t*8YVTz9pv+{{-pKY8i6$e z|5pfXT-!a|eIG2D*t*0V_5Z^3()DwE(dyy&=_LWUp-_w?NB-cspewYuP5Yc%^x(5j z1T+lmpEUyiQ3MW}R|S9i&G#S7{_^MF|Mk_ufWAZQBhH@XAIs7!&f~Pm%Sxz|M4k=p zO?_09c_@`?dd{26Qrga^D$ne7u7<;5B z&*Lx-5mS=JlSF#L_5^1(mmFFzKR#qaD zXH`2+OGTcAvZw^!MHPEQpo;TsY2JO%w>l%!{F(HNQqJSEQ3Zly!8bD+)z=w%Eb>z8 z4-Z-*O+#3RjGj?PmwTRP=yrH%CmP_X<1wLcXFS1{!z55j?68vm6h?3mluDMo4Z_fe zY~#xJM@lAhuo6@!owa%((&8i#q19H86oC@+mM0oPAEM>?QCLBj$nv}-52DeW?SKXt z)bDEWdx$Sizqn*{Zo|q8Syty-YP56KKp%=y#j1)!<+fMR`JSHZjD?n>5w;2->abQ-o*ISs;WIi*S`+t)OCNeZ7O)mQrVc|XBeM?z3s^vl zJIZ4`N@uQ7B*%5lGj|>*at4JbSPCsVkXaJvNDD&`g3~DK$~O!06z?jidWzSX*-F$n zwx0!M2J@dnlf|rZw1am;PrClrNPHCg7uC%i;kfc z5Tu`fJbP5u5=Kr;!_C3K<7}RT@eAEW-OgR=-;127aCWqSSfCHWmkL@8prh zgssVBtNX|*;iL0{9vjtYbhArlA8{r))}!tP5KSabPtXYK9|bFm!NU^|RJwtjechHEIKw3XOGepV(j8l z9G$a9K=v1xo@4WY&az{%5OqzGV2D|Z*J*`A@pCFhAPiee)n-GmiM9RN?w9zOl}ID8 z47RPK^`a>8$oL@M(U(}j#R?j9TEe(BT4pgtX_tf-v3}J|UG$U?T0iy&+N1)zeG*|Q z;bp4uWK=G?Q}2y84M8@Eu?R@h$gTVU7E3N#^gS?PQl~Pj#E}FWSJ}J5<1naUu`y|) z$g|{J;5Nd(R2)fhhZ33n4?Vrs3N>pnz{4e`mt;dbCf)Eju2|5TfMS?}?*(9lsv{is z5j3mi`GJlZ)*@R6u0ib?hcYPL&yh=kFL<^n*TWV}Lya3O7M~!8ND`V>od6?)44Z~H z$yN0Q(E0b{@@%A0nTbgYg91*~iR@(PI-r$O)k&p2+!^GG@K;L>1Hx5BWB~IJ^78#G zNTu)VG}rgjAkKW>VUZHvkO5`$xP10_Yx=~H=s31vzYcmdNdNhF98A!c{*bCJk==v{ zVVsTkDk79T^D<8b#w78PFtw46{zHCZswn%&cvS3s!4Hu?Y_k8a$Q3)W`Sr#n8tK9< zE-@i47B+Bc(*~1zAc@dWG4By2Sp?-{&74`#SX<#wdED8{ykwaAWSivwdUReQPV&c5h84(v5;!TknLoZp|m*Tf=9v zRFtC&(u;T-Q&Ayb8-_t8k8@OAVi!w`M`e&HU!kLbs&fv*rzuvCAd_Q5_fR*kne_ZhNM?b zhpu35X$Ke%C@IGCj_#EJVmB^jh`&3eGJ*~h%-#ir+u5I)PCGl2LgOl>ID=tAXGt|p4p?i7BOb}C+$$j9T)@h%T(DNI{ z@1gP{82Z~FMd9egi*Q-j+Y!?d!4XA6W#kpHbjFm(f~XMr9JL-w+_?zg(^2*TT!aOt zO2Gn!S^)2O9VcTJ9RaCM>2r|F0#k0)tavtv-cu? zb_ivY=~BR8O@#5$O@qshE?y|+z?7<*?4t=WJ)zx6U|guaQ_?%umY%=}?OfXz>_7-t zTuGTjlGUPzvPgnZ>g=YCZFakd6%xK<(4$YYX=lQzuU#=n8av`~9b2NRsx@p}1&FdJ z|6o6`cD**~&k`@h0vq#BWJXqjDwACs;{z8Q#qc>gt0aRon`D^Z&vSym*?4C|4Y|PR zDeuXU!@f|`g(srSPjM-c>{m=0D(dr>%PZ-cEZ1e@J7Fk?=Bp uao*x_RXcARf6TXZ?z2E))pBhka-}ojCyoP`OK>Nu%boVcBB5Upd literal 3336 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 KemBAJXZJ4>?ed}k From 5c3c2a969763ca2006b36da1462c04498f078fa9 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 17:59:29 +0800 Subject: [PATCH 23/30] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 044566d..f19206b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .git.zip +.DS_Store From 8728e44344b2569b55e19254e5157ff8494a3bec Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:20:57 +0800 Subject: [PATCH 24/30] rename namespace --- 4_mpi_module/mpi_module.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 0076069..63376ec 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -1,5 +1,5 @@ moduleIdentifier: - namespace: microsoft.com/office/demo + namespace: microsoft.com/office moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi From f92814bad7f563ce848f7777c0877bec454161cb Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:24:02 +0800 Subject: [PATCH 25/30] update datatype --- 4_mpi_module/mpi_module.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 63376ec..9d6099f 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -19,7 +19,7 @@ metadata: helpDocument: http://readthedocs.com/proj inputs: - name: Input Port - type: [DataFrameDirectory, ImageDirectory] + type: [AnyFile, AnyDirectory] - name: Parameter 1 type: String default: hello @@ -37,7 +37,7 @@ inputs: description: The Integer parameter which has a range validation. outputs: - name: Output Port - type: DataFrameDirectory + type: AnyDirectory runConfig: nodeCount: type: Integer From 34ba2513fecaa9126224872dd653a96c129a1dfd Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Fri, 27 Mar 2020 00:26:23 +0800 Subject: [PATCH 26/30] update description --- 4_mpi_module/mpi_module.yaml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/4_mpi_module/mpi_module.yaml b/4_mpi_module/mpi_module.yaml index 9d6099f..6055327 100644 --- a/4_mpi_module/mpi_module.yaml +++ b/4_mpi_module/mpi_module.yaml @@ -3,15 +3,7 @@ moduleIdentifier: moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi -description: | - Mpi module for demo. - To create an MPI module: - * Set `type` to 'Mpi'. - * Optional: add `runConfig` to specify the specification of run-level configurations. - This module also demos: - * Input port which supports multiple data types. - * Specification of Integer / Mode parameters. - * How to use a pre-registered environment of the worksapace. +description: Mpi module for demo. metadata: properties: tags: [nlp, bert] From cc8151b0c398b18e81c4ac96ca69829d520d13e2 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Thu, 26 Mar 2020 18:45:10 +0800 Subject: [PATCH 27/30] rename key --- 8_merge_files/module_spec.yaml | 2 +- 9_smart_reply_pytorch/module_spec.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/8_merge_files/module_spec.yaml b/8_merge_files/module_spec.yaml index 3a98468..77ec9b5 100644 --- a/8_merge_files/module_spec.yaml +++ b/8_merge_files/module_spec.yaml @@ -1,7 +1,7 @@ moduleIdentifier: namespace: microsoft.com/office moduleName: Merge every n files together - version: 0.0.2 + moduleVersion: 0.0.2 metadata: annotations: familyId: cdd3b0ba-a1a1-4a70-bb71-88b9d59904b7 diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index 5428b89..92a2b24 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,7 +1,7 @@ moduleIdentifier: namespace: microsoft.com/office - moduleName: '[AE365][SmartReply][AML][Test] PyTorch Distributed' - version: 0.0.2.0309172714 + moduleName: "[AE365][SmartReply][AML][Test] PyTorch Distributed" + moduleVersion: 0.0.2.0309172714 type: Mpi metadata: annotations: From 4ab90f9eb04e390b1ef56ee815ad23f20c6edf44 Mon Sep 17 00:00:00 2001 From: Zhidong Zhu Date: Mon, 30 Mar 2020 19:06:14 +0800 Subject: [PATCH 28/30] rename namespace --- 5_mpi_module_using_env/mpi_module.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5_mpi_module_using_env/mpi_module.yaml b/5_mpi_module_using_env/mpi_module.yaml index e375192..c630667 100644 --- a/5_mpi_module_using_env/mpi_module.yaml +++ b/5_mpi_module_using_env/mpi_module.yaml @@ -1,5 +1,5 @@ moduleIdentifier: - namespace: microsoft.com/office/demo + namespace: microsoft.com/office moduleName: Mpi Module moduleVersion: 0.0.1 type: Mpi From 75ff1d409fe79b70d9c52a0e84a95b4017133532 Mon Sep 17 00:00:00 2001 From: Wentao Dai Date: Mon, 30 Mar 2020 17:38:01 +0800 Subject: [PATCH 29/30] Update spec to json-schema passed --- 0_official_module/clean_missing_data.yaml | 14 +++++++------- 1_basic_kfc/kubeflow.yaml | 7 +++++-- 2_eselect/eselect.yaml | 1 + 7.1_kfc_merge_files_add_aml_identifier/kfc.yaml | 5 +++-- 7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml | 5 +++-- 7_kfc_merge_files/kfc.yaml | 5 ++++- 9_smart_reply_pytorch/module_spec.yaml | 2 +- 7 files changed, 24 insertions(+), 15 deletions(-) diff --git a/0_official_module/clean_missing_data.yaml b/0_official_module/clean_missing_data.yaml index b036204..eabbddf 100644 --- a/0_official_module/clean_missing_data.yaml +++ b/0_official_module/clean_missing_data.yaml @@ -1,7 +1,7 @@ moduleIdentifier: namespace: zhizhu.com/test moduleName: New Clean Missing Data - moduleVersion: 0.0.116.1 + moduleVersion: 0.0.116 isDeterministic: true category: Data Transformation description: Specifies how to handle the values missing from a dataset. @@ -115,12 +115,12 @@ implementation: - inputValue: Maximum missing value ratio - --cleaning-mode - inputValue: Cleaning mode - - - --replacement-value - - inputValue: Replacement value - - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column + - --replacement-value + - inputValue: Replacement value + - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column - --cleaned-dataset - outputPath: Cleaned dataset - --cleaning-transformation diff --git a/1_basic_kfc/kubeflow.yaml b/1_basic_kfc/kubeflow.yaml index 51a979e..5874544 100644 --- a/1_basic_kfc/kubeflow.yaml +++ b/1_basic_kfc/kubeflow.yaml @@ -1,8 +1,11 @@ -name: xgboost4j - Train classifier +moduleIdentifier: + namespace: zhizhu.com/test + moduleName: xgboost4j - Train classifier + moduleVersion: 0.0.1 description: Trains a boosted tree ensemble classifier using xgboost4j inputs: -- {name: Training data} +- {name: Training data, type: DataFrameDirectory} - {name: Rounds, type: Integer, default: '30', help: Number of training rounds} outputs: diff --git a/2_eselect/eselect.yaml b/2_eselect/eselect.yaml index 1cb776d..4c7e291 100644 --- a/2_eselect/eselect.yaml +++ b/2_eselect/eselect.yaml @@ -1,6 +1,7 @@ moduleIdentifier: moduleName: eselect moduleVersion: 0.0.1 + namespace: test/abc description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. inputs: - name: columns diff --git a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml index 53d831c..c71c9b2 100644 --- a/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml +++ b/7.1_kfc_merge_files_add_aml_identifier/kfc.yaml @@ -1,6 +1,7 @@ -amlIdentifier: +moduleIdentifier: moduleName: Merge every n files together cdd3b0ba - version: 0.0.1 + moduleVersion: 0.0.1 + namespace: test/test inputs: - name: InputFolder type: LocalPath diff --git a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml index af80e69..9ff41a9 100644 --- a/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml +++ b/7.2_kfc_merge_files_datatype_has_dicts/kfc.yaml @@ -1,6 +1,7 @@ -amlIdentifier: +moduleIdentifier: moduleName: Merge every n files together cdd3b0ba - version: 0.0.1 + moduleVersion: 0.0.1 + namespace: test/test inputs: - name: InputFolder with single simple type type: String diff --git a/7_kfc_merge_files/kfc.yaml b/7_kfc_merge_files/kfc.yaml index 9c3add3..c71c9b2 100644 --- a/7_kfc_merge_files/kfc.yaml +++ b/7_kfc_merge_files/kfc.yaml @@ -1,4 +1,7 @@ -name: Merge every n files together cdd3b0ba +moduleIdentifier: + moduleName: Merge every n files together cdd3b0ba + moduleVersion: 0.0.1 + namespace: test/test inputs: - name: InputFolder type: LocalPath diff --git a/9_smart_reply_pytorch/module_spec.yaml b/9_smart_reply_pytorch/module_spec.yaml index 92a2b24..b50c22c 100644 --- a/9_smart_reply_pytorch/module_spec.yaml +++ b/9_smart_reply_pytorch/module_spec.yaml @@ -1,7 +1,7 @@ moduleIdentifier: namespace: microsoft.com/office moduleName: "[AE365][SmartReply][AML][Test] PyTorch Distributed" - moduleVersion: 0.0.2.0309172714 + moduleVersion: 0.0.2-a0309172714 type: Mpi metadata: annotations: From 175f3f3f92ebbc9c7bb6d4a6f5d47b2708513cd9 Mon Sep 17 00:00:00 2001 From: Wentao Dai Date: Mon, 30 Mar 2020 20:29:58 +0800 Subject: [PATCH 30/30] Update spec --- 0_official_module/clean_missing_data.yaml | 12 ++++++------ 2_eselect/eselect.yaml | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/0_official_module/clean_missing_data.yaml b/0_official_module/clean_missing_data.yaml index eabbddf..67c9dab 100644 --- a/0_official_module/clean_missing_data.yaml +++ b/0_official_module/clean_missing_data.yaml @@ -115,12 +115,12 @@ implementation: - inputValue: Maximum missing value ratio - --cleaning-mode - inputValue: Cleaning mode - - --replacement-value - - inputValue: Replacement value - - --cols-with-all-missing-values - - inputValue: Cols with all missing values - - --generate-missing-value-indicator-column - - inputValue: Generate missing value indicator column + - - --replacement-value + - inputValue: Replacement value + - - --cols-with-all-missing-values + - inputValue: Cols with all missing values + - - --generate-missing-value-indicator-column + - inputValue: Generate missing value indicator column - --cleaned-dataset - outputPath: Cleaned dataset - --cleaning-transformation diff --git a/2_eselect/eselect.yaml b/2_eselect/eselect.yaml index 4c7e291..1cb776d 100644 --- a/2_eselect/eselect.yaml +++ b/2_eselect/eselect.yaml @@ -1,7 +1,6 @@ moduleIdentifier: moduleName: eselect moduleVersion: 0.0.1 - namespace: test/abc description: Selects columns from input file based on the column description in the first line. Similar to cut (and grep), but column names can be used. inputs: - name: columns