{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "02785614-9268-41c8-85a5-d579490edbbf", "metadata": { "tags": [] }, "outputs": [], "source": [ "!pip install huggingface-hub -Uqq" ] }, { "cell_type": "code", "execution_count": 6, "id": "9e6bd7ee-16a3-4f5a-8857-8bbba83eb9e7", "metadata": { "tags": [] }, "outputs": [], "source": [ "from huggingface_hub import snapshot_download\n", "from pathlib import Path\n", "\n", "local_model_path = Path(\"./LLM_bloomz_model\")\n", "local_model_path.mkdir(exist_ok=True)\n", "model_name = \"bigscience/bloomz-7b1-mt\"\n", "commit_hash = \"13e9b1a39fe86c8024fe15667d063aa8a3e32460\"" ] }, { "cell_type": "code", "execution_count": 7, "id": "94e8abc5-a58e-40e2-b1e6-fbf48307c716", "metadata": { "tags": [] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "99ac229433d34bf693511ca8c97d87dc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Fetching 11 files: 0%| | 0/11 [00:00
Clean data in minutes
Automatically visualize data, and improve data quality in a few clicks. Learn more
Remind me later
Don't show again
" ], "text/plain": [ "<__main__.DiscoveryWidget at 0x7f00f8f509d0>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import sagemaker\n", "from sagemaker import image_uris\n", "import boto3\n", "import os\n", "import time\n", "import json\n", "\n", "role = sagemaker.get_execution_role() # execution role for the endpoint\n", "sess = sagemaker.session.Session() # sagemaker session for interacting with different AWS APIs\n", "bucket = sess.default_bucket() # bucket to house artifacts\n", "\n", "region = sess._region_name\n", "account_id = sess.account_id()\n", "\n", "s3_client = boto3.client(\"s3\")\n", "sm_client = boto3.client(\"sagemaker\")\n", "smr_client = boto3.client(\"sagemaker-runtime\")" ] }, { "cell_type": "code", "execution_count": 3, "id": "ffcb98ae-dd3d-42a5-94e8-a17d6551ed33", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'sagemaker-us-east-1-106839800180'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bucket" ] }, { "cell_type": "code", "execution_count": 9, "id": "40dd8f16-ae7c-48bf-8e52-1a15425fa74d", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'LLM-RAG/workshop/LLM_bloomz_deploy_code'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s3_model_prefix = \"LLM-RAG/workshop/LLM_bloomz_model\" # folder where model checkpoint will go\n", "model_snapshot_path = list(local_model_path.glob(\"**/snapshots/*\"))[0]\n", "s3_code_prefix = \"LLM-RAG/workshop/LLM_bloomz_deploy_code\"\n", "s3_code_prefix" ] }, { "cell_type": "code", "execution_count": 10, "id": "067292c9-c066-4649-a61f-b460a24da584", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/special_tokens_map.json to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/special_tokens_map.json\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/.gitattributes to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/.gitattributes\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/README.md to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/README.md\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/config.json to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/config.json\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/tokenizer_config.json to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/tokenizer_config.json\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/logs/tensorboard/events.out.tfevents.1664349718.jean-zay-iam09.104164.0 to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/logs/tensorboard/events.out.tfevents.1664349718.jean-zay-iam09.104164.0\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/logs/tensorboard/events.out.tfevents.1664280553.jean-zay-iam33.24300.0 to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/logs/tensorboard/events.out.tfevents.1664280553.jean-zay-iam33.24300.0\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/logs/tensorboard/events.out.tfevents.1664281554.jean-zay-iam33.28878.0 to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/logs/tensorboard/events.out.tfevents.1664281554.jean-zay-iam33.28878.0\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/tokenizer.json to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/tokenizer.json\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/logs/logs/main_log.txt to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/logs/logs/main_log.txt\n", "upload: LLM_bloomz_model/models--bigscience--bloomz-7b1-mt/snapshots/13e9b1a39fe86c8024fe15667d063aa8a3e32460/pytorch_model.bin to s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/pytorch_model.bin\n" ] } ], "source": [ "!aws s3 cp --recursive {model_snapshot_path} s3://{bucket}/{s3_model_prefix}" ] }, { "cell_type": "code", "execution_count": 11, "id": "6f7c4277-4480-42c6-aee6-1fbcca94eb82", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Image going to be used is ---- > 763104351884.dkr.ecr.us-east-1.amazonaws.com/djl-inference:0.21.0-deepspeed0.8.0-cu117\n" ] } ], "source": [ "inference_image_uri = image_uris.retrieve(\n", " framework=\"djl-deepspeed\", region=region, version=\"0.21.0\"\n", ")\n", "print(f\"Image going to be used is ---- > {inference_image_uri}\")\n", "\n", "\n", "# inference_image_uri = (\n", "# f\"763104351884.dkr.ecr.{region}.amazonaws.com/djl-inference:0.21.0-deepspeed0.8.0-cu117\"\n", "# )\n", "\n", "# print(f\"Image going to be used is ---- > {inference_image_uri}\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "8d771bdb-11d2-45d2-9bef-face29221838", "metadata": { "tags": [] }, "outputs": [], "source": [ "!mkdir -p LLM_bloomz_deploy_code" ] }, { "cell_type": "code", "execution_count": 13, "id": "e5348ecb-43df-4094-97d8-a6723004862a", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing LLM_bloomz_deploy_code/model.py\n" ] } ], "source": [ "%%writefile LLM_bloomz_deploy_code/model.py\n", "from djl_python import Input, Output\n", "import torch\n", "import logging\n", "import math\n", "import os\n", "from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer\n", "\n", "\n", "def load_model(properties):\n", " tensor_parallel = properties[\"tensor_parallel_degree\"]\n", " model_location = properties['model_dir']\n", " if \"model_id\" in properties:\n", " model_location = properties['model_id']\n", " logging.info(f\"Loading model in {model_location}\")\n", " \n", " tokenizer = AutoTokenizer.from_pretrained(model_location)\n", " \n", " model = AutoModelForCausalLM.from_pretrained(\n", " model_location, \n", " device_map=\"balanced_low_0\", \n", " #load_in_8bit=True\n", " )\n", " model.requires_grad_(False)\n", " model.eval()\n", " \n", " return model, tokenizer\n", "\n", "\n", "model = None\n", "tokenizer = None\n", "generator = None\n", "\n", "\n", "def handle(inputs: Input):\n", " global model, tokenizer\n", " if not model:\n", " model, tokenizer = load_model(inputs.get_properties())\n", "\n", " if inputs.is_empty():\n", " return None\n", " data = inputs.get_as_json()\n", " \n", " input_sentences = data[\"inputs\"]\n", " params = data[\"parameters\"]\n", " \n", " # preprocess\n", " input_ids = tokenizer(input_sentences, return_tensors=\"pt\").input_ids\n", " # pass inputs with all kwargs in data\n", " if params is not None:\n", " outputs = model.generate(input_ids, **params)\n", " else:\n", " outputs = model.generate(input_ids)\n", "\n", " # postprocess the prediction\n", " prediction = tokenizer.decode(outputs[0], skip_special_tokens=True)\n", " \n", " result = {\"outputs\": prediction}\n", " return Output().add_as_json(result)" ] }, { "cell_type": "code", "execution_count": 14, "id": "8996fe44-8e70-468b-abc1-38187cb33f4f", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing LLM_bloomz_deploy_code/serving.properties\n" ] } ], "source": [ "%%writefile LLM_bloomz_deploy_code/serving.properties\n", "engine=Python\n", "option.tensor_parallel_degree=4\n", "option.s3url = s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_model/" ] }, { "cell_type": "code", "execution_count": 15, "id": "0ae6734a-aacd-410d-818d-0a962697c3c4", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rm: cannot remove 'model.tar.gz': No such file or directory\n", "LLM_bloomz_deploy_code/\n", "LLM_bloomz_deploy_code/model.py\n", "LLM_bloomz_deploy_code/serving.properties\n" ] } ], "source": [ "!rm model.tar.gz\n", "!tar czvf model.tar.gz LLM_bloomz_deploy_code" ] }, { "cell_type": "code", "execution_count": 16, "id": "0f77dc76-6d8c-4665-ba88-f03e887c136c", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "S3 Code or Model tar ball uploaded to --- > s3://sagemaker-us-east-1-946277762357/LLM-RAG/workshop/LLM_bloomz_deploy_code/model.tar.gz\n" ] } ], "source": [ "s3_code_artifact = sess.upload_data(\"model.tar.gz\", bucket, s3_code_prefix)\n", "print(f\"S3 Code or Model tar ball uploaded to --- > {s3_code_artifact}\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "ef974ca1-9638-45a8-9145-ea9d03b2b072", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bloomz-7b1-mt-2023-04-19-05-41-01-178\n", "Image going to be used is ---- > 763104351884.dkr.ecr.us-east-1.amazonaws.com/djl-inference:0.21.0-deepspeed0.8.0-cu117\n", "Created Model: arn:aws:sagemaker:us-east-1:946277762357:model/bloomz-7b1-mt-2023-04-19-05-41-01-178\n" ] } ], "source": [ "from sagemaker.utils import name_from_base\n", "import boto3\n", "\n", "model_name = name_from_base(f\"bloomz-7b1-mt\") # Append a timestamp to the provided string\n", "print(model_name)\n", "print(f\"Image going to be used is ---- > {inference_image_uri}\")\n", "\n", "create_model_response = sm_client.create_model(\n", " ModelName=model_name,\n", " ExecutionRoleArn=role,\n", " PrimaryContainer={\n", " \"Image\": inference_image_uri,\n", " \"ModelDataUrl\": s3_code_artifact\n", " },\n", " \n", ")\n", "model_arn = create_model_response[\"ModelArn\"]\n", "\n", "print(f\"Created Model: {model_arn}\")" ] }, { "cell_type": "code", "execution_count": 18, "id": "233bb3a4-d737-41ad-8fcc-7082c6278e8c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{'EndpointConfigArn': 'arn:aws:sagemaker:us-east-1:946277762357:endpoint-config/bloomz-7b1-mt-2023-04-19-05-41-01-178-config',\n", " 'ResponseMetadata': {'RequestId': 'cc8b2d9e-368b-47fe-81f9-fc3a086ee814',\n", " 'HTTPStatusCode': 200,\n", " 'HTTPHeaders': {'x-amzn-requestid': 'cc8b2d9e-368b-47fe-81f9-fc3a086ee814',\n", " 'content-type': 'application/x-amz-json-1.1',\n", " 'content-length': '125',\n", " 'date': 'Wed, 19 Apr 2023 05:41:12 GMT'},\n", " 'RetryAttempts': 0}}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "endpoint_config_name = f\"{model_name}-config\"\n", "endpoint_name = f\"{model_name}-endpoint\"\n", "\n", "endpoint_config_response = sm_client.create_endpoint_config(\n", " EndpointConfigName=endpoint_config_name,\n", " ProductionVariants=[\n", " {\n", " \"VariantName\": \"variant1\",\n", " \"ModelName\": model_name,\n", " \"InstanceType\": \"ml.g5.12xlarge\",\n", " \"InitialInstanceCount\": 1,\n", " # \"VolumeSizeInGB\" : 400,\n", " # \"ModelDataDownloadTimeoutInSeconds\": 2400,\n", " \"ContainerStartupHealthCheckTimeoutInSeconds\": 15*60,\n", " },\n", " ],\n", ")\n", "endpoint_config_response" ] }, { "cell_type": "code", "execution_count": 19, "id": "734a39b0-473e-4421-94c8-74d2b4105038", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created Endpoint: arn:aws:sagemaker:us-east-1:946277762357:endpoint/bloomz-7b1-mt-2023-04-19-05-41-01-178-endpoint\n" ] } ], "source": [ "create_endpoint_response = sm_client.create_endpoint(\n", " EndpointName=f\"{endpoint_name}\", EndpointConfigName=endpoint_config_name\n", ")\n", "print(f\"Created Endpoint: {create_endpoint_response['EndpointArn']}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "08969928-6b9e-4d9c-a033-a31f5f77bdfb", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: Creating\n", "Status: Creating\n", "Status: Creating\n", "Status: Creating\n", "Status: Creating\n" ] } ], "source": [ "import time\n", "\n", "resp = sm_client.describe_endpoint(EndpointName=endpoint_name)\n", "status = resp[\"EndpointStatus\"]\n", "print(\"Status: \" + status)\n", "\n", "while status == \"Creating\":\n", " time.sleep(60)\n", " resp = sm_client.describe_endpoint(EndpointName=endpoint_name)\n", " status = resp[\"EndpointStatus\"]\n", " print(\"Status: \" + status)\n", "\n", "print(\"Arn: \" + resp[\"EndpointArn\"])\n", "print(\"Status: \" + status)" ] }, { "cell_type": "code", "execution_count": 65, "id": "e56bfdaa-3469-4784-aa8a-e32177cde3f2", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 585 µs, sys: 3.35 ms, total: 3.93 ms\n", "Wall time: 11 ms\n" ] } ], "source": [ "%%time\n", "import json\n", "import boto3\n", "\n", "smr_client = boto3.client(\"sagemaker-runtime\")\n", "\n", "parameters = {\n", " #\"early_stopping\": True,\n", " #\"length_penalty\": 2.0,\n", " \"max_new_tokens\": 50,\n", " \"temperature\": 0,\n", " \"min_length\": 10,\n", " \"no_repeat_ngram_size\": 2,\n", "}" ] }, { "cell_type": "code", "execution_count": 66, "id": "bd86caf8-01e9-41eb-9199-478ba471a02b", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'{\\n \"outputs\":\"AWS Clean Rooms 的FAQ文档有提到 Q: 是否发起者和数据贡献者都会被收费?A: 是单方收费,只有查询的接收方会收费。\\\\n请问AWS Clean Rooms是多方都会收费吗?\\\\n 不\"\\n}'" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prompts1 = \"\"\"AWS Clean Rooms 的FAQ文档有提到 Q: 是否发起者和数据贡献者都会被收费?A: 是单方收费,只有查询的接收方会收费。\n", "请问AWS Clean Rooms是多方都会收费吗?\n", "\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": prompts1,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": 67, "id": "ebb4a46c-7c15-4f7d-8c55-b0d18dd693a2", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'{\\n \"outputs\":\"请问AWS Clean Rooms是多方都会收费吗? 是的\"\\n}'" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prompts1 = \"\"\"请问AWS Clean Rooms是多方都会收费吗?\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": prompts1,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": 68, "id": "42b5c30a-c04f-423e-8464-4b9cd78e9749", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'{\\n \"outputs\":\"请问AWS Clean Rooms的一个协作中可以有多少个参与方? 最多 100\"\\n}'" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prompts1 = \"\"\"请问AWS Clean Rooms的一个协作中可以有多少个参与方?\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": prompts1,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": 71, "id": "2833f1c1-0c26-4c52-9e33-276ae48a9bce", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'{\\n \"outputs\":\"AWS Clean Rooms 的FAQ文档有提到, Question: AWS Clean Rooms的一个协作中可以有多少个参与方? Answer: 每个协作AWS Clean Rooms最多支持五名参与方。\\\\n请问AWS Clean Rooms的一个协作中可以有多少个参与方? 五\"\\n}'" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prompts1 = \"\"\"AWS Clean Rooms 的FAQ文档有提到, Question: AWS Clean Rooms的一个协作中可以有多少个参与方? Answer: 每个协作AWS Clean Rooms最多支持五名参与方。\n", "请问AWS Clean Rooms的一个协作中可以有多少个参与方?\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": prompts1,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": null, "id": "7ef3b257-5dbd-4aa9-8e0e-5c0636323286", "metadata": { "tags": [] }, "outputs": [], "source": [ "input=\"\"\"\n", "AWS 文档中提到: Q:在中国区是否可用?\n", "A: 目前没有落地中国区的时间表,已经在以下区域推出:美国东部(弗吉尼亚州北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(首尔)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)、欧洲地区(伦敦)和欧洲地区(斯德哥尔摩)\n", "\n", "Q: 为什么在合成的小数据集上第一次查询的时候需要几分钟才返回?\n", "A:第一次查询的时候是因为调度和拉起资源的影响,一般第二次查询就会变快。 但过一段时间后,资源释放后这个问题又会出现。在资源拉起期间是不进行收费的。\n", "\n", "Q:能支持多大规模数据的查询?查询速度怎么样?\n", "A:能支持TB/GB级数据的查询。 一般查询延迟为几十秒到几分钟。默认计算容量为32 CRPUs, 目前这个默认计算容量不可设置,但是roadmap中未来打算让用户可以进行设置。(Slack中Ryan 提到,如果引擎中任务有积压,它能够scale up)\n", "\n", "Q: AWS Clean Rooms 是如何计费的?\n", "A: 按照CRPU-hour单价进行计费,每个查询默认计算容量为32 CRPUs。 金额 = (0.125 hours x 32 CRPUs * $0.656 per CRPU-hour) , 有1分钟的最小计费时间。头12个月内,会有9CRPU hours的免费额度。\n", "\n", "Q: AWS Clean Rooms 从哪里可以看到CRPU-hours的用量?\n", "A: AWS Clean Rooms 本身的workspace中无法查看,可以在AWS Billing/Bills 中查看Usage Quantity得到该信息。\n", "\n", "Q: 目前可以支持什么数据源的接入? \n", "A: 目前只支持S3,其他数据源近期没有具体计划。\n", "\n", "Q: 一个协作中,最大的并发查询数是多少?\n", "A: 5个\n", "\n", "Q: 我们如何说服客户相信洁净室的安全性和正确性?我在这里的大多数合规计划中都看不到Clean Rooms, https://aws.amazon.com/compliance/services-in-scope/ ?\n", "A: 正在加入这些合规计划的进程中。\n", "\n", "\n", "使用方法与限制相关:\n", "\n", "Q: 数据源必须在AWS上么?\n", "A: 对,目前必须在AWS上,而且必须是同一个region。\n", "\n", "Q: 数据是如何进入到S3?\n", "A: 需要数据的持有者,把数据上传到S3上,然后再用Glue爬去下,拿到表的schema。这样才能关联到AWS CleanRooms。\n", "\n", "Q: 这些安全控制权限只是作用与分析么?能够改动它方的数据么?\n", "A: 对,只作用于分析,不能修改对方数据\n", "\n", "Q: 协作方的数据会移动么?协作方的原始数据会集中到Clean rooms 吗?\n", "A: 在联合分析获取他方数据时数据存在移动,但协作方的原始数据并不会存住在clean room内,clean room并不是一个物理存贮空间。\n", "\n", "Q: 是否发起者和数据贡献者都会被收费?\n", "A: 是单方收费,只有查询的接收方会进行收费。\n", "\n", "Q: 数据贡献方的S3, 会产生API会产生调用次数收费么?\n", "A: 会, Glue Data Catalog API 的调用也会被收费, 如果加密数据用了KMS-CMK也会被相应的收费。\n", "\n", "Q: 是否有一个强约束,两方的数据中一定要一个join字段才能够进行分析?\n", "A: List 和Aggregation两种不同的分析规则下有区别, List 只能支持重合用户的,所以必须要有关联字段。Aggregation可以支持你仅仅去查询对方的数据,这种情况下,是可以不指定关联字段的。\n", "\n", "Q: 如果已经在用Athena,S3桶中已经有数据了,是否能基于S3中这个数据就地加入AWS Clean Room?\n", "A: 是的,就地就能加入clean room, 这个S3桶就是一般的S3桶,并没有任何特殊。但这个S3路径不能注册到AWS Lake Formation中。\n", "\n", "Q: 是否能通过SDK也就是代码来调用Clean room的联合分析\n", "A: 可以,可以参考代码 https://gitlab.aws.dev/rmalecky/aws-clean-rooms-notebooks/-/blob/main/single_collaborator_aggregation.ipynb\n", "\n", "Q: 在输出分析结果的时候,能否按照字段进行分区?\n", "A: 目前不能\n", "\n", "Q: 最大的参与方是多少? 如果超过了限制怎么办?\n", "A: 目前5个参与方为最大限制,这个是软性的限制,slack频道中有披露最大支持的硬限制为10.\n", "\n", "\n", "数据加密相关:\n", "\n", "Q: AWS clean rooms 用的什么加密算法?\n", "A: C3R,是aws开源加密代码库。提供了C3R Client(一个可执行的Jar包),目前仅支持对csv和parquet文件格式进行加密,后续可能会支持更多格式。 由于clean room把所有的字段分成三种类型: 指纹列(fingerprint column), 密封列(sealed column), 明文列(cleartext column), 他们的加密方式有所不同,C3R client 会使用AES-GCM加密算法对sealed字段进行加密,会使用HMAC(Hash-based Message Authentication Code)来对fingerprint字段进行加密。\n", "\n", "Q: 加密过程中有密文落地么?如果有,密文存在哪里?\n", "A:由于C3R是客户端加密,所以clean room 关联S3中的数据已经是加密后的密文。\n", "\n", "Q: 数据上传到S3的过程中,有两种加密方式Server Side 和 Client Side加密,如果客户的安全等级比较高,在数据上传之前做了加密,再想交给clean room 去处理,之前提到的C3R的加密方式,具体是一个怎么样的流程呢?\n", "A: 首先Clean room 对于Server Side的加密是透明的,无需额外处理。Clean rooms 不支持S3的客户端加密,必须采用C3R客户端进行加密,加密完成以后把数据上传到S3桶,后续流程和不加密的流程是一致的。 加密这步需要比较多的手工操作,包括:\n", "\n", "* 加密前需要创建好collaboration(协作), 得到collaboration_id后续在加密中需要提供\n", "* 利用openssl 生成32位密钥并分享给其他协作方。\n", "* 加密过程中需要指定哪些字段为指纹列(fingerprint column), 密封列(sealed column), 明文列(cleartext column)\n", "\n", "\n", "Q: AWS Clean Room在安全计算方面,应该归属哪一类?\n", "A: (待补充)\n", "\n", "Q: 是否所有的字段都可以进行加密?\n", "A: 对于sealed和 fingerprint字段,只有string字段类型被支持。对于csv文件,C3R的客户端处理任何值都作为UTF-8编码的文本,加密前不会做任何其他的前置处理。对于parquet文件,对sealed和 fingerprint字段,如果出现非string的字段,会直接报错。C3R 客户端不能处理parquet中的复杂字段比如struct。\n", "\n", "Q: 如果要对某个字段进行求和,求平均的数据计算,是否可以加密?\n", "A: 不能,只能作为cleartext明文列\n", "\n", "Q: 如果想要通过某些字段进行where过滤,这些字段应该是什么类型?\n", "A: 只能是cleartext明文列\n", "\n", "Q: C3R客户端是否有实现任何non-standard的加密算法?\n", "A: 基本都是标准化的算法,除了一个HKDF(一种密钥推导函数)的实现(来自RFC5869), 但是使用的是java标准加密库中的MAC算法。\n", "\n", "\n", "宏观问题:\n", "\n", "Q: AWS Clean rooms 与 AMC的区别与联系是什么?\n", "A: AMC是一个专门服务与Amazon Ads的clean room应用,它是并且将持续是唯一的服务于Amazon Ads客户的应用服务。AWS Clean Rooms 是一个云分析服务,会服务于各个行业的数据合作需求。2023年, AMC 将会把自己的查询引擎和计算基础设置迁移到AWS Clean Rooms服务,将会帮助AMC更方便的服务于客户(他们将不再需要把自己第一方数据上传到AMC,在AWS S3上即可使用).\n", "\n", "Q: AWS Clean rooms 与 其他的clean room服务商的区别?\n", "A: AWS Clean rooms 覆盖的客户范围更广。而其他的服务商客户范围相对小,需要把数据移动到他们的平台上。AWS Clean rooms则无需数据移动。(Bastion 2021年announce的时候,其他的云厂商比如(google cloud 和 microsoft azure) 还没有通用场景的clean room solution,snowflake 有,功能上有区别,只允许data provider 提供预先固定的SQL,Bastion灵活性更好。snowflake要求数据必须进入他们的数仓,aws在S3 即可)。\n", "\n", "Q: 有哪些典型的应用场景?\n", "A: 包含多个行业,下面提供部分参考\n", "\n", "* 广告营销领域:\n", " * 需要进行广告营销活动,流量平台方需要给广告主或者营销方他们的广告点击数据和展现数据进行分析,但是不能提供用户级别的信息。\n", " * 典型客户:营销方或广告主 P&G, Barclays,媒体-流量平台 Amazon Ads, Comcast, NBC Universal\n", "* 零售领域\n", " * 银行和零售商需要获取他们的重叠用户,用于进行联合的市场活动,但不要把客户的其他信息暴露给彼此。(比如非场合用户)\n", "* 医疗健康领域 (结合之前的HCLS Slides, 并不是来自Bastion)\n", " * 药厂和医院之间,药厂需要医院的病历数据; 药厂和外包的研发机构之间需要进行数据的共享。\n", " * 典型客户:Change Healthcare, AstraZeneca \n", "* 其他领域的一些典型的客户\n", " * 数据服务商 Foursquare ,Nielsen, IRI, \n", " * 其他 Cars.com\n", " \n", "内部信息(来自Bastion PRFAQ(2021年))[Internal Only]:\n", "\n", "Q: AWS Clean Rooms 的 data catalog 是如何实现的? data sharing permission 是如何实现的?\n", "A: 都是利用了AWS Lake formation, AWS Clean Rooms 里 SQL中字段级别的限制约束,是通过一种new class of AWS Lake formation permission 来实现的。\n", "\n", "Q: 可以在哪些地方进行Clean room的联合分析?\n", "A: 可以在clean room 的 workspace, 也可以在Redshift workspace (Note: 从目前发布产品文档上并没有,但是说明背后的引擎就是redshift severless)\n", "\n", "Q: 数据提供方如果对联合分析的收益方进行收费,或者实现一个数据授权的合同?\n", "A: 需要通过AWS Data Exchange 来进行 (Note: 目前AWS Clean Rooms并没有体现)\n", "\n", "Q: AWS Clean Rooms 与 AWS Data Exchange 是什么关系?\n", "A: AWS Clean Rooms 可以通过AWS Data Exchange 去浏览和寻找可用数据的合作方。 他是AWS Data Exchange的更近一步的服务,提供了可控(多种约束限制)和可审计的数据合作方式\n", "\n", "Q: AWS Clean Rooms中是否支持视图?\n", "A: 允许客户在clean room 创建视图,并且在AWS Clean Rooms中保存物化视图,一旦退出协作,AWS Lake formation permission 将会被撤销,这些物化视图会被删除。(Note: 目前AWS Clean Rooms并没有体现)\n", "\n", "Q: 如果数据合作方没有aws account,能否支持?\n", "A: 目前这个版本不支持,后续的版本可能会考虑(NBC Universal 希望对于没有aws账号另外一方的数据可用)\n", "\n", "Q: 是否能够支持这个协作中,仅仅允许指定运行固定的SQL?\n", "A: 可以,可以利用query template来做(Note: 目前AWS Clean Rooms并没有体现)\n", "\n", "Q: AWS Clean Rooms可以让数据贡献者提供一些样例数据进行预览么?\n", "A: 可以这么做,可以提供一些没有任何约束的示例数据给用户(Note: 目前AWS Clean Rooms并没有体现)\n", "\n", "Q: 当一个数据贡献者的数据发生更新后会怎么样?\n", "A: 它是一种live的共享,任何更新会立刻反映到联合分析的结果中\n", "\n", "Q: AWS Clean Rooms 未来有哪些前进的方向?\n", "A: 主要有四个方向:\n", "\n", "1. Identity matching 身份ID对齐 (Note: 目前这项在官方的PPT在有体现)\n", "2. 对隐私攻击的防护, 有些查询即使是一些聚合分析,仍然可能探查到个人的信息\n", " 1. 限制访问同一块范围数据的query的数量\n", " 2. 采用差分隐私(Differential Privacy) 结果中添加噪声(会影响分析的精度),Morgen Stanley 作为这个功能的beta用户\n", "3. 机器学习,P&G 表现出这方面的需求, 应该也是基于表格数据的模型,可能是流失预测,人群聚类等场景\n", "4. 和DSP的集成,直接把激活用户ID给到对接的DSP,而不通过cleanroom的数据接收方\n", "\n", "\n", "Q: Service Team 有哪些相关的同事?\n", "A: Horne, Bill , Rababy, Bethany , Malecky, Ryan , Malik, Mohsen , Tanna, Shamir \n", "\n", "请问AWS Clean rooms 在中国区是否可用?\n", "\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": input,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": 79, "id": "300ea836-f049-4955-ba89-14e67ec7019f", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'{\\n \"outputs\":\"\\\\nAWS 文档中提到: \\\\n可用性和性能相关:\\\\n\\\\nQuestion: 在中国区是否可用?\\\\nAnswer: 目前没有落地中国区的时间表,已经在以下区域推出:美国东部(弗吉尼亚州北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(首尔)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)、欧洲地区(伦敦)和欧洲地区(斯德哥尔摩)\\\\n\\\\nQuestion: 为什么在合成的小数据集上第一次查询的时候需要几分钟才返回?\\\\nAnswer: 第一次查询的时候是因为调度和拉起资源的影响,一般第二次查询就会变快。\\\\n...\\\\n\\\\n请问AWS Clean rooms 为什么第一次运行很慢?\\\\n第一次运行的原因是调度的拉起的资源影响\"\\n}'" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input=\"\"\"\n", "AWS 文档中提到: \n", "可用性和性能相关:\n", "\n", "Question: 在中国区是否可用?\n", "Answer: 目前没有落地中国区的时间表,已经在以下区域推出:美国东部(弗吉尼亚州北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(首尔)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)、欧洲地区(伦敦)和欧洲地区(斯德哥尔摩)\n", "\n", "Question: 为什么在合成的小数据集上第一次查询的时候需要几分钟才返回?\n", "Answer: 第一次查询的时候是因为调度和拉起资源的影响,一般第二次查询就会变快。\n", "...\n", "\n", "请问AWS Clean rooms 为什么第一次运行很慢?\n", "\"\"\"\n", "\n", "response_model = smr_client.invoke_endpoint(\n", " EndpointName=endpoint_name,\n", " Body=json.dumps(\n", " {\n", " \"inputs\": input,\n", " \"parameters\": parameters\n", " }\n", " ),\n", " ContentType=\"application/json\",\n", " )\n", "\n", "response_model['Body'].read().decode('utf8')" ] }, { "cell_type": "code", "execution_count": 75, "id": "97657e82-9677-49e5-88a8-9c2454147d28", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "4307" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(input)" ] }, { "cell_type": "code", "execution_count": null, "id": "4f2b397a-9af3-4d68-8285-6417861147c5", "metadata": { "tags": [] }, "outputs": [], "source": [ "sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", "sm_client.delete_model(ModelName=model_name)" ] }, { "cell_type": "code", "execution_count": 54, "id": "f70d116f-4fb1-4f04-8732-3d6e4fb520de", "metadata": { "tags": [] }, "outputs": [], "source": [ "!aws sagemaker delete-endpoint --endpoint-name bloomz-7b1-mt-2023-04-13-09-54-18-256-endpoint" ] }, { "cell_type": "code", "execution_count": 55, "id": "184e4d1d-3d62-43df-9b17-5d64ece928bd", "metadata": { "tags": [] }, "outputs": [], "source": [ "!aws sagemaker delete-endpoint-config --endpoint-config-name bloomz-7b1-mt-2023-04-13-09-54-18-256-config" ] } ], "metadata": { "availableInstances": [ { "_defaultOrder": 0, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.t3.medium", "vcpuNum": 2 }, { "_defaultOrder": 1, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.t3.large", "vcpuNum": 2 }, { "_defaultOrder": 2, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.t3.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 3, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.t3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 4, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5.large", "vcpuNum": 2 }, { "_defaultOrder": 5, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 6, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 7, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 8, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 9, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 10, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 11, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 12, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5d.large", "vcpuNum": 2 }, { "_defaultOrder": 13, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5d.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 14, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5d.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 15, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5d.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 16, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5d.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 17, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5d.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 18, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5d.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 19, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 20, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": true, "memoryGiB": 0, "name": "ml.geospatial.interactive", "supportedImageNames": [ "sagemaker-geospatial-v1-0" ], "vcpuNum": 0 }, { "_defaultOrder": 21, "_isFastLaunch": true, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.c5.large", "vcpuNum": 2 }, { "_defaultOrder": 22, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.c5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 23, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.c5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 24, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.c5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 25, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 72, "name": "ml.c5.9xlarge", "vcpuNum": 36 }, { "_defaultOrder": 26, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 96, "name": "ml.c5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 27, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 144, "name": "ml.c5.18xlarge", "vcpuNum": 72 }, { "_defaultOrder": 28, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.c5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 29, "_isFastLaunch": true, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g4dn.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 30, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g4dn.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 31, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g4dn.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 32, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g4dn.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 33, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g4dn.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 34, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g4dn.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 35, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 61, "name": "ml.p3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 36, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 244, "name": "ml.p3.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 37, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 488, "name": "ml.p3.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 38, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.p3dn.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 39, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.r5.large", "vcpuNum": 2 }, { "_defaultOrder": 40, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.r5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 41, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.r5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 42, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.r5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 43, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.r5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 44, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.r5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 45, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 512, "name": "ml.r5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 46, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.r5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 47, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 48, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 49, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 50, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 51, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 52, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 53, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.g5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 54, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.g5.48xlarge", "vcpuNum": 192 } ], "instance_type": "ml.m5.large", "kernelspec": { "display_name": "Python 3 (Data Science 3.0)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/sagemaker-data-science-310-v1" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 5 }