{ "cells": [ { "cell_type": "markdown", "id": "3e4eb758", "metadata": {}, "source": [ "## Compute Sample" ] }, { "cell_type": "markdown", "id": "2460ecfc", "metadata": {}, "source": [ "In this demo notebook we will showcase running a compute to data:\n", "\n", "- we will create a table in a private data collection that cannot be accessed remotely\n", "- we'll populate it with data\n", "- run a compute to data task to train a model without having access to the data\n", "- verify the task lineage\n", "- generate a ZK proof for the data\n", " \n", "The default Weavechain node installation is preconfigured to support this scenario (by connecting to a public weave, having a *private* data collection defined and mapped to a in-process SQLite instance and read rights for that collection already given)." ] }, { "cell_type": "markdown", "id": "8e0dbccf", "metadata": {}, "source": [ "### 1. Create an API session" ] }, { "cell_type": "code", "execution_count": 31, "id": "d96cfcaf", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\"res\":\"ok\",\"data\":\"pong 1674735153640\"}\n" ] } ], "source": [ "import pandas as pd\n", "\n", "from weaveapi.records import *\n", "from weaveapi.options import *\n", "from weaveapi.filter import *\n", "from weaveapi.weaveh import *\n", "\n", "WEAVE_CONFIG = \"config/demo_client_local.config\"\n", "nodeApi, session = connect_weave_api(WEAVE_CONFIG)" ] }, { "cell_type": "markdown", "id": "bb1eacb9", "metadata": {}, "source": [ "### 2. Read data from the prepared file" ] }, { "cell_type": "markdown", "id": "b272d4cf", "metadata": {}, "source": [ "- go to the folder where the local node was installed\n", "- download [sample.csv](https://public.weavechain.com/file/sample.csv) and place it under storage/file/private_files folder or run\n", "```\n", "mkdir -p storage/files/private_files\n", "cd storage/files/private_files\n", "curl -O https://public.weavechain.com/file/sample.csv\n", "```\n", "- theoretically we could have used the file from the jupyter server, using this step to show how to connect a local storage to the node\n", "- the *private_files* storage is already configured in the node at install time, the following config section marking it as non-replicated and as storing raw files (many formats are supported, from CSV to feather or ORC, for those each file being treated as a table)\n", "```\n", " 'private_files': {\n", " 'connectionAdapterType': 'file',\n", " 'replication': {\n", " 'type': 'none',\n", " },\n", " 'fileConfig': {\n", " 'rootFolder': 'weavestorage/files',\n", " 'format': 'file'\n", " }\n", " }\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "id": "568e52c8", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnameagegenderair_pollutionalcohol_usedust_allergyoccupational_hazardsgenetic_riskchronic_lung_disease...fatigueweight_lossshortness_of_breathwheezingswallowing_difficultyclubbing_of_fingernailsfrequent_colddry_coughsnoringlevel
01Lorenzo Rasmussen331245432...3422312341
12Zechariah Gallegos171315342...1378621722
23Lukas Jenkins351456554...8792146723
34Trey Holden371777767...4231456753
45Branson Rivera461687776...3241424233
\n", "

5 rows × 26 columns

\n", "
" ], "text/plain": [ " id name age gender air_pollution alcohol_use \\\n", "0 1 Lorenzo Rasmussen 33 1 2 4 \n", "1 2 Zechariah Gallegos 17 1 3 1 \n", "2 3 Lukas Jenkins 35 1 4 5 \n", "3 4 Trey Holden 37 1 7 7 \n", "4 5 Branson Rivera 46 1 6 8 \n", "\n", " dust_allergy occupational_hazards genetic_risk chronic_lung_disease \\\n", "0 5 4 3 2 \n", "1 5 3 4 2 \n", "2 6 5 5 4 \n", "3 7 7 6 7 \n", "4 7 7 7 6 \n", "\n", " ... fatigue weight_loss shortness_of_breath wheezing \\\n", "0 ... 3 4 2 2 \n", "1 ... 1 3 7 8 \n", "2 ... 8 7 9 2 \n", "3 ... 4 2 3 1 \n", "4 ... 3 2 4 1 \n", "\n", " swallowing_difficulty clubbing_of_fingernails frequent_cold dry_cough \\\n", "0 3 1 2 3 \n", "1 6 2 1 7 \n", "2 1 4 6 7 \n", "3 4 5 6 7 \n", "4 4 2 4 2 \n", "\n", " snoring level \n", "0 4 1 \n", "1 2 2 \n", "2 2 3 \n", "3 5 3 \n", "4 3 3 \n", "\n", "[5 rows x 26 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "file_storage = \"private_files\"\n", "file = \"sample.csv\"\n", "\n", "import csv, base64\n", "from io import StringIO\n", "reply = nodeApi.downloadTable(session, file_storage, file, None, \"file\", READ_DEFAULT_NO_CHAIN).get()\n", "data = base64.b64decode(reply[\"data\"]).decode(\"utf-8-sig\")\n", "\n", "df = pd.read_csv(StringIO(data), sep=\",\")\n", "display(df.head())" ] }, { "cell_type": "markdown", "id": "ac907012", "metadata": {}, "source": [ "### 2. Create a local table private table starting from the file" ] }, { "cell_type": "markdown", "id": "7b4a5e29", "metadata": {}, "source": [ "- we drop the existing table if already existing and re-create it from scratch\n", "- a weavechain node can also connect to existing tables, reading their structure, but in this case we create it via the API\n", "- we create the table in a pre-configured data collection that will be not replicated and stored in a local SQLite\n", "```\n", " 'private_files': {\n", " 'connectionAdapterType': 'sqlite',\n", " 'replication': {\n", " 'type': 'none',\n", " },\n", " 'jdbcConfig': {\n", " 'database': 'weavestorage/storage_private.db'\n", " }\n", " }\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "id": "b3f3b1da", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'res': 'ok', 'target': {'operationType': 'CREATE_TABLE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}}\n", "{'res': 'ok', 'target': {'operationType': 'WRITE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}, 'data': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg,4RKj6WTnS2AQrLXz04Sr2UnBxcS7dn0am5ymb2KiHDs=,3pHcKrG2afiuoMQ6x6w8GaArkn5TjjfwCcwiCqWotW1kUKMPh4kAv32yBmU8Lr85dcYcv1g68TexDb4riPMZAyQB'}\n" ] } ], "source": [ "data_collection = \"private\"\n", "table = \"oncology_data\"\n", "\n", "columns = {}\n", "for c in df.columns:\n", " if c == \"id\":\n", " coldef = { \"type\": \"LONG\", \"isIndexed\": True, \"isUnique\": True, \"isNullable\": False }\n", " elif c == \"name\":\n", " coldef = { \"type\": \"STRING\", \"readTransform\": \"ERASURE\" }\n", " else:\n", " coldef = { \"type\": \"DOUBLE\" }\n", " columns[c] = coldef\n", "\n", "layout = { \n", " \"columns\": columns, \n", " \"idColumnIndex\": 0, \n", " \"isLocal\": False,\n", " \"applyReadTransformations\": True\n", "}\n", "#print(layout)\n", "\n", "nodeApi.dropTable(session, data_collection, table).get()\n", "reply = nodeApi.createTable(session, data_collection, table, CreateOptions(False, False, layout)).get()\n", "print(reply)\n", "\n", "records = Records(table, df.to_numpy().tolist())\n", "reply = nodeApi.write(session, data_collection, records, WRITE_DEFAULT).get()\n", "print(reply)" ] }, { "cell_type": "code", "execution_count": 4, "id": "a4053b5b", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnameagegenderair_pollutionalcohol_usedust_allergyoccupational_hazardsgenetic_riskchronic_lung_disease...fatigueweight_lossshortness_of_breathwheezingswallowing_difficultyclubbing_of_fingernailsfrequent_colddry_coughsnoringlevel
01Lorenzo Rasmussen331245432...3422312341
12Zechariah Gallegos171315342...1378621722
23Lukas Jenkins351456554...8792146723
34Trey Holden371777767...4231456753
45Branson Rivera461687776...3241424233
\n", "

5 rows × 26 columns

\n", "
" ], "text/plain": [ " id name age gender air_pollution alcohol_use \\\n", "0 1 Lorenzo Rasmussen 33 1 2 4 \n", "1 2 Zechariah Gallegos 17 1 3 1 \n", "2 3 Lukas Jenkins 35 1 4 5 \n", "3 4 Trey Holden 37 1 7 7 \n", "4 5 Branson Rivera 46 1 6 8 \n", "\n", " dust_allergy occupational_hazards genetic_risk chronic_lung_disease \\\n", "0 5 4 3 2 \n", "1 5 3 4 2 \n", "2 6 5 5 4 \n", "3 7 7 6 7 \n", "4 7 7 7 6 \n", "\n", " ... fatigue weight_loss shortness_of_breath wheezing \\\n", "0 ... 3 4 2 2 \n", "1 ... 1 3 7 8 \n", "2 ... 8 7 9 2 \n", "3 ... 4 2 3 1 \n", "4 ... 3 2 4 1 \n", "\n", " swallowing_difficulty clubbing_of_fingernails frequent_cold dry_cough \\\n", "0 3 1 2 3 \n", "1 6 2 1 7 \n", "2 1 4 6 7 \n", "3 4 5 6 7 \n", "4 4 2 4 2 \n", "\n", " snoring level \n", "0 4 1 \n", "1 2 2 \n", "2 2 3 \n", "3 5 3 \n", "4 3 3 \n", "\n", "[5 rows x 26 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()\n", "#print(reply)\n", "df = pd.DataFrame(reply[\"data\"])\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "id": "7085e7a3", "metadata": {}, "source": [ "### 3. Mark the table private" ] }, { "cell_type": "code", "execution_count": 5, "id": "2a807a16", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'res': 'ok',\n", " 'target': {'operationType': 'UPDATE_LAYOUT',\n", " 'organization': 'weavedemo',\n", " 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg',\n", " 'scope': 'private',\n", " 'table': 'oncology_data'}}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "layout[\"isLocal\"] = True\n", "nodeApi.updateLayout(session, data_collection, table, json.dumps({ \"layout\": layout})).get()" ] }, { "cell_type": "markdown", "id": "ad3648df", "metadata": {}, "source": [ "and data cannot be read any longer except from the local node (we expect a **Not authorized** reply here)" ] }, { "cell_type": "code", "execution_count": 6, "id": "d8e69e28", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'res': 'err', 'target': {'operationType': 'READ', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}, 'message': 'Not authorized'}\n" ] } ], "source": [ "reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()\n", "print(reply)" ] }, { "cell_type": "markdown", "id": "7d1ccc5d", "metadata": {}, "source": [ "### 4. Train an ML model on the private data" ] }, { "cell_type": "markdown", "id": "6134f664", "metadata": {}, "source": [ "- run on the node machine\n", "```\n", " docker pull gcr.io/weavechain/oncology_xgboost:latest\n", "```\n", "- use latest-arm64 if your machine is ARM\n", "- the data owner needs to purposely enable running a certain image\n", "- the node needs to be able to connect to the local docker instance (it is already configured in the demo config, see [how to configure compute](https://docs.weavechain.com/configure-compute.html) how to make docker accept connection from the local node)\n", "- in the default configuration file installed with the node, the sample script is pre-authorized with the following line\n", "```\n", " 'allowedImages': [ 'gcr.io/weavechain/oncology_xgboost' ]\n", "```\n", "- in case of error, uncomment the #print(reply) below to see details\n", "- (compute to data is just one of the patterns of confidential computing supported, MPC and Homomorphic Encryption could also be used)" ] }, { "cell_type": "code", "execution_count": 32, "id": "33cf61e3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\"model\": \"YmluZgAAAD8XAAAAAwAAAAEAAAAAAAAAAQAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAG11bHRpOnNvZnRwcm9iBgAAAAAAAABnYnRyZWUsAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAsAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAAAAAgAAAAIAAIAAAJBAAAAAgAMAAAAEAAAACgAAgAAAYEAAAAAABQAAAAYAAAAJAACAAADwQAEAAIAHAAAACAAAABYAAIAAAKBAAQAAAAkAAAAKAAAACQAAgAAAIEACAACA//////////8AAAAA1mVlvgIAAAD//////////wAAAADmFLw+AwAAgP//////////AAAAAEGE5D4DAAAA//////////8AAAAA5RlPvgQAAID//////////wAAAADkGc8+BAAAAP//////////AAAAAG0+Y779nEdD4zjeQ1p2i70AAAAASfgoQ3EcU0P6hyI/AAAAAGRhoUFUVWlDjUE0vwAAAADk9SNC4zgCQycHqz8AAAAAz+gWQhzHoUJlQ/6+AAAAAAAAAACN42RDMio/vwAAAAAAAAAA4ziOQBW8nD8AAAAAAAAAAKqq8kI2br4/AAAAAAAAAADjOA5BlJUsvwAAAAAAAAAA4zgOQZOVrD8AAAAAAAAAAP//j0KwXj2/AAAAAAEAAAAVAAAAAAAAA...\n" ] } ], "source": [ "reply = nodeApi.compute(session, \"gcr.io/weavechain/oncology_xgboost\", COMPUTE_DEFAULT).get()\n", "#print(reply)\n", "output = reply[\"data\"][\"output\"]\n", "print(output[:1200] + \"...\")\n", "output = json.loads(output)" ] }, { "cell_type": "markdown", "id": "f9e13c74", "metadata": {}, "source": [ "### 5. Check the variable importance in the trained model" ] }, { "cell_type": "markdown", "id": "4ce2a4f5", "metadata": {}, "source": [ "- we can now use the model that was trained that is not seen by the researcher\n", "- we need to install xgboost in order to do so, run the section below only once (ARM machines might xgboost encounter version mismatches)" ] }, { "cell_type": "code", "execution_count": null, "id": "2d95d59c", "metadata": {}, "outputs": [], "source": [ "!pip install scikit-learn\n", "!pip install xgboost\n", "!pip install matplotlib" ] }, { "cell_type": "code", "execution_count": 24, "id": "c2882ff2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.9/dist-packages/xgboost/sklearn.py:782: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n" ] }, { "data": { "image/png": "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NpsVERGh33//3apPTEyM/Pz85OnpqaioKJ07d65MtQIAAAAAAAAAAFyLWyIsmzx5smJiYvTCCy9o3759WrZsmfz8/HTmzBl1795dlSpVUnJysv773/9q06ZNGjVqVLnGHzJkiH799VclJibq448/1rvvvqtjx45d0m/69OmKiIjQDz/8oF69emnw4ME6ceJEqeOePXtWc+fO1dKlS7Vt2zZlZWVp/PjxlvaXX35ZCQkJiouLU1JSknJzcy/7XbR/mjhxoj7++GMtXrxYu3btUnBwsLp3764TJ04oMDBQ2dnZMpvNmjdvnrKzszVw4MAyjTthwgTFxsYqOTlZVapUUZ8+fVRQUFBi39WrV+uZZ57RuHHj9OOPP+qxxx7To48+qq1bt0r6K+js27evTpw4oS+//FIbN27U4cOHrWpZuXKlpk2bplmzZmnnzp0KCAjQm2++edka8/PzlZuba3UBAAAAAAAAAACU100flp0+fVrz58/XnDlzNHToUNWtW1ft27fX8OHDtWzZMp07d05LlixRo0aN1KVLFy1YsEBLly69ZOdSafbv369NmzZp4cKFuuOOO9S8eXMtWrRIf/755yV9IyMjNWjQIAUHB2vWrFnKy8vTd999V+rYBQUFevvtt9WyZUs1b95co0aN0ubNmy3tb7zxhiZPnqz+/furfv36WrBgQZmPSjxz5ozeeustvfLKK+rZs6caNGighQsXytXVVe+9957s7e0tx0J6eXnJ399frq6uZRp76tSpuvvuuxUeHq7Fixfr999/1+rVq0vsO3fuXEVGRurJJ59UvXr1NHbsWA0YMEBz586VJG3evFl79uzRsmXL1KJFC91xxx1asmSJvvzyS8suuHnz5ikqKkpRUVEKDQ3Viy++qAYNGly2xtmzZ8vLy8tyBQYGlmltAAAAAAAAAAAAf3fTh2VpaWnKz89X165dS2xr0qSJ3N3dLffatWunoqIipaenl2n89PR0OTg4qHnz5pZ7wcHBqlSp0iV9GzdubPnb3d1dZrO5xB1oF7m5ualu3bqW3wEBAZb+OTk5+v3339W6dWtLu729vVq0aFGmujMyMlRQUKB27dpZ7jk6Oqp169ZKS0sr0xiladOmjeVvHx8fhYaGljpmWlqaVQ3SX/8GF/unpaUpMDDQKsxq0KCBvL29rfrccccdpdZQksmTJysnJ8dyHT16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vXv31saNG5WRkaFvv/1WEyZM0K5duyr1Xit8Ztn1ODs731CbJNnYXMr2SkpKTMdu5Nter776qubOnas5c+YoNDRUVapUUXR0tC5cuFDuscri78GgwWBQcXGxJGn79u167LHHNHXqVEVGRppm3ZX2Pa+KuF5BQYEiIyMVGRmpJUuWyMvLS5mZmYqMjDS7/99++03//Oc/NWTIEA0ePNh0vKznS1dOobweV1dX7dmzRwkJCdq4caMmT56s2NhYJScny8PDw6yvo6Oj6QN/AAAAAAAAAADciTLieli6hKtyc3PTN998ozlz5igvL0/16tXT7NmzTasKnjt3Tq+//rpiYmJUvXp1PfLII5IuZRKrV6/WM888ow4dOsjGxkbdunUzhWlXYzAYtHbtWk2YMEFPPPGETpw4IW9vb3Xo0EE1a9as1Hut8LCsYcOGcnBwUFJSkurVqyfpUqCVnJys6OhoFRQUaPHixSosLLwi1HF1db3m1L3LH3rLzs42Lc+XkpJSah3fffed6tatK0k6ffq0Dh06pODgYElSUlKSevXqpccff1ySVFxcrEOHDplN/3NwcDCbHVaa4OBgJSUlmR1LSkpSQECA2cyua/n2229Vr149TZgwwXTsp59+KtO5N+LgwYM6efKk4uLiTNMf/57Injt3Tr169VJQUJBee+21cp9fmoYNG8re3l47duy44s/l8sw0SbKzs1NERIQiIiI0ZcoUeXh46Ouvv1afPn1u6r4BAAAAAAAAAEDZBQcHa/369Vdtf+qpp/TUU0+V2la3bl2tXr36qufGxsYqNjb2iuOurq5644039MYbb5S73ptR4WFZlSpV9J///Edjx46Vp6en6tatq5kzZ+qPP/7Q4MGDVVxcrDfffFOPPvqoxo8fL3d3d3333Xdq3bq1AgMDFRsbq6efflo1atRQ9+7ddfbsWSUlJemZZ56Rs7Oz7rvvPsXFxal+/frKyckx+97XX02bNk3VqlVTzZo1NWHCBFWvXl29e/eWJPn7+2v58uX69ttvVbVqVb322ms6fvy4WVjm5+enHTt2KCMjQ0ajUZ6enldc47nnnlOrVq304osvql+/ftq+fbvmzZun+fPnl/l5+fv7KzMzU59++qlatWqlL7/8UitXrizfQy+HunXrysHBQW+++aaefvpp7d+/Xy+++KJZn6eeekpZWVnavHmzTpw4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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import base64\n", "from xgboost import XGBClassifier\n", "\n", "f = open(\"model.serialization\", \"wb\")\n", "f.write(base64.b64decode(output[\"model\"]))\n", "f.close()\n", "\n", "model = XGBClassifier()\n", "model.load_model('model.serialization')\n", "if output.get(\"features\") is not None:\n", " model.get_booster().feature_names = output[\"features\"]\n", "#print(model)\n", "\n", "vimp = model.get_booster().get_score(importance_type='weight')\n", "#print(vimp)\n", "keys = list(vimp.keys())\n", "values = list(vimp.values())\n", "data = pd.DataFrame(data=values, index=keys, columns=[\"score\"]).sort_values(by = \"score\", ascending=False)\n", "data.nlargest(30, columns=\"score\").plot(kind='barh', figsize = (20, 10)).invert_yaxis()" ] }, { "cell_type": "markdown", "id": "b1dff85b", "metadata": {}, "source": [ "### 6. Verify signature for the output model" ] }, { "cell_type": "markdown", "id": "0745b9b3", "metadata": {}, "source": [ "- the signature is done on the hash of all input data, the hash of the docker image and the hash of the output\n", "- these hashes could be put on a blockchain as a proof of the ML model lineage\n", "- somebody with access to data can verify the input hashes\n", "- if multiple people have access to the data (and the training is deterministic), the same hashes are expected to be signed by different nodes" ] }, { "cell_type": "code", "execution_count": 25, "id": "937f59ad", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Signature: 2psqu7mwhn3KLy1Vzb9uSBh1QSNuka4aynk7m7VwXvdvDe5cAzXd3HP4NGtgWNV2pzToEsadGJNTpPwtxmNgcE3z\n", "Valid: True\n", "\n", "Input Hash: 6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN\n", "Compute Hash: 3ia9p7Ayg6PBmFg9zUXVyrmUYbt4jz4YCUY3Cx7nXE1Q\n", "Output Hash: YWuSGd184YZhfDWw758gPJaEmsCNqe6rfGBkznbWuF5\n", "Output: {\"model\": \"YmluZgAAAD8XAAAAAwAAAAEAAAAAAAAAAQAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAG11bHRpOnNvZnRwcm9iBgAAAAAAAABnYnRyZWUsAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...6IjMifX0=\", \"features\": [\"age\", \"air_pollution\", \"alcohol_use\", \"balanced_diet\", \"chest_pain\", \"chronic_lung_disease\", \"clubbing_of_fingernails\", \"coughing_of_blood\", \"dry_cough\", \"dust_allergy\", \"fatigue\", \"frequent_cold\", \"gender\", \"genetic_risk\", \"obesity\", \"occupational_hazards\", \"passive_smoker\", \"shortness_of_breath\", \"smoking\", \"snoring\", \"swallowing_difficulty\", \"weight_loss\", \"wheezing\"]}\n" ] } ], "source": [ "import base58\n", "data = reply[\"data\"]\n", "\n", "signature = data[\"outputSignature\"]\n", "check = nodeApi.verifyLineageSignature(signature, data.get(\"inputHash\"), data.get(\"computeHash\"), data.get(\"paramsHash\"), data[\"output\"])\n", "\n", "print(\"Signature:\", data[\"outputSignature\"])\n", "print(\"Valid:\", check)\n", "print(\"\\nInput Hash:\", data[\"inputHash\"])\n", "print(\"Compute Hash:\", data[\"computeHash\"])\n", "print(\"Output Hash:\", data[\"outputHash\"])\n", "print(\"Output:\", data[\"output\"][:400] + \"...\" + data[\"output\"][-400:])" ] }, { "cell_type": "markdown", "id": "d89d717b", "metadata": {}, "source": [ "### 7. Generate zk proofs for data" ] }, { "cell_type": "markdown", "id": "69a8fdcb", "metadata": {}, "source": [ "- Bulletproofs are used and multiple gadgets are supported (see the [API](https://docs.weavechain.com/api.html#Bulletproofs))\n", "- generating proofs can be very time consuming as the volume of data grows" ] }, { "cell_type": "code", "execution_count": 26, "id": "36771cdb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A1BoqCGaWqcPbn46SdNoWUgC3T3i3D9TXHLdauL55MDxpCosaRwtFoMHDj8MFchaStvrMUk7EkGDGEptdyGk5vh2RjYSAFZBio1XuDRTkau2AYED4eA1zZV26GEX6rytpvH8SJ4DJevS2WKeDsL2fHPQ4zwuLqkqSNUhWCJPeoZmsQ56VPNJoqKewC6sDLPE1so33wA5bJpot8oFUpiETCEiMFF4J72ZDHbR46ix9kcVdZugiJJhFaVanyq8U7SATHLZyNxH4abjQ2aXEuVWtfnU3guuqggUFLg8R5BwmkMtvwZXXrxJAR3gHnxs3EFv887csDyTyxiPsj2U51gd4E32AXbDADH9b5DUFLWVWsqfxV7QDmG9yT2k2nuhoByTgL9jhMjwErgAKw24...UErC2vvTcKwUbpZXcoaKuyKj4S3gzUaWVt3ZamD7yEmu8nb1EFR9wPNF8pDj5ErfQT4JbGLK86d3DfunZ5DxvF9zaXneALTedwdjviyQNykK7uMR2kyqvbwZ75apJhMrQNemigN5ndYX5QymEStKrTKgm1QVaLLxGAtjJHdqAeXtRDnd2bGQ2uFMCSJJQqFxFrKNWK2CK6dxg52jB6xRKzbN3GH4jXFDrjQUgXtvgBThd7VYBtZGK9STmcpsGPKujzu7Ls9NEuXHgTFJaXQdZ1CaUCvcGxrqE3EDooiE13gkqDkpbqBg2Mo9SzmreYugnWY9PiHrLfRzgthssH4hh63MAfmPwSa7oFp8c1RarNUeScXQw4YPGtAZJvC23m2SLhySyDxedHckZs3c\n" ] } ], "source": [ "options = ZKOptions(False, 300, [\"*\"], 2048, DEFAULT_COMMITMENT)\n", "reply = nodeApi.zkProof(session, data_collection, table, \"numbers_are_non_zero\", json.dumps({}), [ \"age\" ], None, options).get()\n", "proof = reply[\"data\"]\n", "print(proof[:400] + \"...\" + proof[-400:])" ] }, { "cell_type": "markdown", "id": "da195c0c", "metadata": {}, "source": [ "#### Verify proof" ] }, { "cell_type": "code", "execution_count": 27, "id": "3ed7b120", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'res': 'ok', 'data': 'true'}\n" ] } ], "source": [ "reply = nodeApi.verifyZkProof(session, proof, \"numbers_are_non_zero\", json.dumps({ \"count\": 1000 }), None, 2048).get()\n", "print(reply)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.9.16" } }, "nbformat": 4, "nbformat_minor": 5 }