Skip to content

Commit

Permalink
Reviewed session 9 and 10
Browse files Browse the repository at this point in the history
  • Loading branch information
svpino committed Mar 26, 2024
1 parent c5a57fb commit f56b6ee
Showing 1 changed file with 56 additions and 55 deletions.
111 changes: 56 additions & 55 deletions program/cohort.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -33732,21 +33732,42 @@
},
{
"cell_type": "code",
"execution_count": 429,
"execution_count": 494,
"id": "f70bcd33-b499-4e2b-953e-94d1ed96c10a",
"metadata": {
"tags": [
"hide-output"
]
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:sagemaker.image_uris:image_uri is not presented, retrieving image_uri based on instance_type, framework etc.\n",
"INFO:sagemaker.processing:Uploaded None to s3://mlschool/session9-pipeline/code/c90fe2477ad62c58fbc0c004cc5ab07f/sourcedir.tar.gz\n",
"INFO:sagemaker.processing:runproc.sh uploaded to s3://mlschool/session9-pipeline/code/f3b7867d7495763812a03744135acb08/runproc.sh\n",
"/Users/svpino/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py:332: UserWarning: Running within a PipelineSession, there will be No Wait, No Logs, and No Job being started.\n",
" warnings.warn(\n",
"INFO:sagemaker.image_uris:image_uri is not presented, retrieving image_uri based on instance_type, framework etc.\n",
"INFO:sagemaker.processing:Uploaded None to s3://mlschool/session9-pipeline/code/c90fe2477ad62c58fbc0c004cc5ab07f/sourcedir.tar.gz\n",
"INFO:sagemaker.processing:runproc.sh uploaded to s3://mlschool/session9-pipeline/code/f3b7867d7495763812a03744135acb08/runproc.sh\n"
]
},
{
"data": {
"text/plain": [
"{'PipelineArn': 'session9-pipeline'}"
"{'PipelineArn': 'arn:aws:sagemaker:us-east-1:325223348818:pipeline/session9-pipeline',\n",
" 'ResponseMetadata': {'RequestId': '1da54e45-294d-4d80-889d-1c94aa4cc9da',\n",
" 'HTTPStatusCode': 200,\n",
" 'HTTPHeaders': {'x-amzn-requestid': '1da54e45-294d-4d80-889d-1c94aa4cc9da',\n",
" 'content-type': 'application/x-amz-json-1.1',\n",
" 'content-length': '85',\n",
" 'date': 'Tue, 26 Mar 2024 19:30:16 GMT'},\n",
" 'RetryAttempts': 0}}"
]
},
"execution_count": 429,
"execution_count": 494,
"metadata": {},
"output_type": "execute_result"
}
Expand Down Expand Up @@ -33779,7 +33800,7 @@
"\n",
"<a href=\"images/deploying-flask.png\" target=\"_blank\"> <img src=\"images/deploying-flask.png\" alt=\"High-level overview of deploying a model using a Flask wrapper\" style=\"max-width: 740px;\" /></a>\n",
"\n",
"Keep in mind that, while good for development and testing, this approach is not the best approach for production systems.\n"
"Keep in mind that, while good for development and testing, this is not the best approach for production systems.\n"
]
},
{
Expand All @@ -33794,22 +33815,22 @@
},
{
"cell_type": "code",
"execution_count": 64,
"execution_count": 496,
"id": "a67726d7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'ModelPackageGroupName': 'basic-penguins',\n",
" 'ModelPackageVersion': 2,\n",
" 'ModelPackageArn': 'arn:aws:sagemaker:us-east-1:325223348818:model-package/basic-penguins/2',\n",
" 'CreationTime': datetime.datetime(2024, 3, 16, 9, 59, 29, 161000, tzinfo=tzlocal()),\n",
" 'ModelPackageVersion': 4,\n",
" 'ModelPackageArn': 'arn:aws:sagemaker:us-east-1:325223348818:model-package/basic-penguins/4',\n",
" 'CreationTime': datetime.datetime(2024, 3, 26, 15, 43, 59, 510000, tzinfo=tzlocal()),\n",
" 'ModelPackageStatus': 'Completed',\n",
" 'ModelApprovalStatus': 'Approved'}"
]
},
"execution_count": 64,
"execution_count": 496,
"metadata": {},
"output_type": "execute_result"
}
Expand Down Expand Up @@ -33838,14 +33859,20 @@
"source": [
"### Step 2 - Downloading the Model\n",
"\n",
"Let's now download the model assets from the location specified in the Model Registry to your local environment.\n",
"\n",
"Let's now download the model assets from the location specified in the Model Registry to your local environment.\n"
]
},
{
"cell_type": "markdown",
"id": "e2891178",
"metadata": {},
"source": [
"We will store this model in a folder called `serving`:\n"
]
},
{
"cell_type": "code",
"execution_count": 65,
"execution_count": 497,
"id": "f2e94adc",
"metadata": {},
"outputs": [],
Expand All @@ -33863,7 +33890,7 @@
},
{
"cell_type": "code",
"execution_count": 66,
"execution_count": 498,
"id": "bd12fbe9",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -33893,7 +33920,7 @@
},
{
"cell_type": "code",
"execution_count": 67,
"execution_count": 499,
"id": "c79a0e74",
"metadata": {
"tags": [
Expand All @@ -33905,14 +33932,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting code/serving/app.py\n"
"Writing code/serving/app.py\n"
]
}
],
"source": [
"%%writefile {CODE_FOLDER}/serving/app.py\n",
"#| filename: app.py\n",
"#| code-line-numbers: true\n",
"# | filename: app.py\n",
"# | code-line-numbers: true\n",
"\n",
"import tarfile\n",
"import tempfile\n",
Expand Down Expand Up @@ -33943,10 +33970,7 @@
" with tarfile.open(MODEL_PATH / \"model.tar.gz\") as tar:\n",
" tar.extractall(path=directory)\n",
"\n",
" Model.model = keras.models.load_model(\n",
" Path(directory) / \"001\"\n",
" )\n",
"\n",
" Model.model = keras.models.load_model(Path(directory) / \"001\")\n",
"\n",
" def predict(self, data):\n",
" \"\"\"\n",
Expand All @@ -33972,10 +33996,7 @@
" prediction = int(np.argmax(predictions[0], axis=-1))\n",
" confidence = float(predictions[0][prediction])\n",
"\n",
" return jsonify({\n",
" \"prediction\": prediction, \n",
" \"confidence\": confidence\n",
" })\n"
" return jsonify({\"prediction\": prediction, \"confidence\": confidence})"
]
},
{
Expand All @@ -33985,9 +34006,7 @@
"source": [
"### Step 4 - Running the Flask Application\n",
"\n",
"We can now run the Flask application to serve the model from a terminal or directly from this notebook.\n",
"\n",
"To run the server from the terminal, use the following command:\n",
"We can now run the Flask application to serve the model from a terminal using the following command:\n",
"\n",
"```bash\n",
"$ flask --app program/code/serving/app.py --debug run --host=0.0.0.0 --port=4242\n",
Expand Down Expand Up @@ -38836,7 +38855,7 @@
},
{
"cell_type": "code",
"execution_count": 430,
"execution_count": 495,
"id": "59d1e634",
"metadata": {
"tags": [
Expand All @@ -38845,32 +38864,14 @@
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:sagemaker.processing:Uploaded None to s3://mlschool/session9-pipeline/code/e29b54bb3fdd20910fddd04762820c7e/sourcedir.tar.gz\n",
"INFO:sagemaker.processing:runproc.sh uploaded to s3://mlschool/session9-pipeline/code/f3b7867d7495763812a03744135acb08/runproc.sh\n",
"/Users/svpino/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py:332: UserWarning: Running within a PipelineSession, there will be No Wait, No Logs, and No Job being started.\n",
" warnings.warn(\n",
"WARNING:sagemaker.workflow._utils:Popping out 'CertifyForMarketplace' from the pipeline definition since it will be overridden in pipeline execution time.\n"
]
},
{
"ename": "ClientError",
"evalue": "An error occurred (ValidationException) when calling the start_pipeline_execution operation: Step type RegisterModel is not supported in local mode.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[430], line 6\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# %%script false --no-raise-error\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m# | eval: false\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# | code: true\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# | output: false\u001b[39;00m\n\u001b[0;32m----> 6\u001b[0m \u001b[43msession9_pipeline\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/workflow/pipeline.py:372\u001b[0m, in \u001b[0;36mPipeline.start\u001b[0;34m(self, parameters, execution_display_name, execution_description, parallelism_config, selective_execution_config)\u001b[0m\n\u001b[1;32m 370\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msagemaker_session\u001b[38;5;241m.\u001b[39mlocal_mode:\n\u001b[1;32m 371\u001b[0m update_args(kwargs, PipelineParameters\u001b[38;5;241m=\u001b[39mparameters)\n\u001b[0;32m--> 372\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msagemaker_session\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msagemaker_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_pipeline_execution\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 373\u001b[0m update_args(kwargs, PipelineParameters\u001b[38;5;241m=\u001b[39mformat_start_parameters(parameters))\n\u001b[1;32m 375\u001b[0m \u001b[38;5;66;03m# retry on AccessDeniedException to cover case of tag propagation delay\u001b[39;00m\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/local/local_session.py:535\u001b[0m, in \u001b[0;36mLocalSagemakerClient.start_pipeline_execution\u001b[0;34m(self, PipelineName, **kwargs)\u001b[0m\n\u001b[1;32m 528\u001b[0m error_response \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 529\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m: {\n\u001b[1;32m 530\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mResourceNotFound\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 531\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMessage\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPipeline \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m does not exist\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(PipelineName),\n\u001b[1;32m 532\u001b[0m }\n\u001b[1;32m 533\u001b[0m }\n\u001b[1;32m 534\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ClientError(error_response, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstart_pipeline_execution\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 535\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mLocalSagemakerClient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pipelines\u001b[49m\u001b[43m[\u001b[49m\u001b[43mPipelineName\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/local/entities.py:678\u001b[0m, in \u001b[0;36m_LocalPipeline.start\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 675\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msagemaker\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mlocal\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpipeline\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m LocalPipelineExecutor\n\u001b[1;32m 677\u001b[0m execution_id \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(uuid4())\n\u001b[0;32m--> 678\u001b[0m execution \u001b[38;5;241m=\u001b[39m \u001b[43m_LocalPipelineExecution\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43mexecution_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexecution_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 680\u001b[0m \u001b[43m \u001b[49m\u001b[43mpipeline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipeline\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_session\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlocal_session\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 682\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 683\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 685\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_executions[execution_id] \u001b[38;5;241m=\u001b[39m execution\n\u001b[1;32m 686\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 687\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStarting execution for pipeline \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m. Execution ID is \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 688\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpipeline\u001b[38;5;241m.\u001b[39mname,\n\u001b[1;32m 689\u001b[0m execution_id,\n\u001b[1;32m 690\u001b[0m )\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/local/entities.py:722\u001b[0m, in \u001b[0;36m_LocalPipelineExecution.__init__\u001b[0;34m(self, execution_id, pipeline, PipelineParameters, PipelineExecutionDescription, PipelineExecutionDisplayName, local_session)\u001b[0m\n\u001b[1;32m 720\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_execution \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 721\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpipeline_dag \u001b[38;5;241m=\u001b[39m PipelineGraph\u001b[38;5;241m.\u001b[39mfrom_pipeline(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpipeline)\n\u001b[0;32m--> 722\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_initialize_step_execution\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpipeline_dag\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 723\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpipeline_parameters \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_initialize_and_validate_parameters(PipelineParameters)\n\u001b[1;32m 724\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_blocked_steps \u001b[38;5;241m=\u001b[39m {}\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/local/entities.py:828\u001b[0m, in \u001b[0;36m_LocalPipelineExecution._initialize_step_execution\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 824\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_execution[step\u001b[38;5;241m.\u001b[39mname] \u001b[38;5;241m=\u001b[39m _LocalPipelineExecutionStep(\n\u001b[1;32m 825\u001b[0m step\u001b[38;5;241m.\u001b[39mname, step\u001b[38;5;241m.\u001b[39mstep_type, step\u001b[38;5;241m.\u001b[39mdescription, step\u001b[38;5;241m.\u001b[39mdisplay_name\n\u001b[1;32m 826\u001b[0m )\n\u001b[1;32m 827\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m step\u001b[38;5;241m.\u001b[39mstep_type \u001b[38;5;241m==\u001b[39m StepTypeEnum\u001b[38;5;241m.\u001b[39mCONDITION:\n\u001b[0;32m--> 828\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_initialize_step_execution\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mif_steps\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43melse_steps\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/dev/ml.school/.venv/lib/python3.10/site-packages/sagemaker/local/entities.py:823\u001b[0m, in \u001b[0;36m_LocalPipelineExecution._initialize_step_execution\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m step\u001b[38;5;241m.\u001b[39mstep_type \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m supported_steps_types:\n\u001b[1;32m 820\u001b[0m error_msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_construct_validation_exception_message(\n\u001b[1;32m 821\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStep type \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m is not supported in local mode.\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(step\u001b[38;5;241m.\u001b[39mstep_type\u001b[38;5;241m.\u001b[39mvalue)\n\u001b[1;32m 822\u001b[0m )\n\u001b[0;32m--> 823\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ClientError(error_msg, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstart_pipeline_execution\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 824\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_execution[step\u001b[38;5;241m.\u001b[39mname] \u001b[38;5;241m=\u001b[39m _LocalPipelineExecutionStep(\n\u001b[1;32m 825\u001b[0m step\u001b[38;5;241m.\u001b[39mname, step\u001b[38;5;241m.\u001b[39mstep_type, step\u001b[38;5;241m.\u001b[39mdescription, step\u001b[38;5;241m.\u001b[39mdisplay_name\n\u001b[1;32m 826\u001b[0m )\n\u001b[1;32m 827\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m step\u001b[38;5;241m.\u001b[39mstep_type \u001b[38;5;241m==\u001b[39m StepTypeEnum\u001b[38;5;241m.\u001b[39mCONDITION:\n",
"\u001b[0;31mClientError\u001b[0m: An error occurred (ValidationException) when calling the start_pipeline_execution operation: Step type RegisterModel is not supported in local mode."
]
"data": {
"text/plain": [
"_PipelineExecution(arn='arn:aws:sagemaker:us-east-1:325223348818:pipeline/session9-pipeline/execution/cpqzzpyrpzy2', sagemaker_session=<sagemaker.workflow.pipeline_context.PipelineSession object at 0x2baa89240>)"
]
},
"execution_count": 495,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
Expand Down

0 comments on commit f56b6ee

Please sign in to comment.