Skip to content

Instantly share code, notes, and snippets.

@kaiwang0112006
Forked from Virnkord/owner.ipynb
Created February 11, 2022 12:05
Show Gist options
  • Save kaiwang0112006/3d3c3c54bce24c9c802d4ac109a03c24 to your computer and use it in GitHub Desktop.
Save kaiwang0112006/3d3c3c54bce24c9c802d4ac109a03c24 to your computer and use it in GitHub Desktop.
PySyft duet multiple Data Owners example. All DO are equal up to variables names.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {
"image/png": {
"unconfined": true,
"width": 400
}
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"🎤 🎸 ♪♪♪ Starting Duet ♫♫♫ 🎻 🎹\n",
"\n",
"♫♫♫ >\u001b[93m DISCLAIMER\u001b[0m:\u001b[1m Duet is an experimental feature currently in beta.\n",
"♫♫♫ > Use at your own risk.\n",
"\u001b[0m♫♫♫ >\n",
"♫♫♫ > Punching through firewall to OpenGrid Network Node at:\n",
"♫♫♫ > http://10.164.0.3:5000\n",
"♫♫♫ >\n",
"♫♫♫ > ...waiting for response from OpenGrid Network... \u001b[92mDONE!\u001b[0m\n",
"♫♫♫ >\n",
"♫♫♫ > \u001b[95mSTEP 1:\u001b[0m Send the following code to your Duet Partner!\n",
"\n",
"import syft as sy\n",
"duet = sy.duet(\"\u001b[1m26f5423fc5e985f314d0ea67ec2e6e87\u001b[0m\")\n",
"\n",
"♫♫♫ > \u001b[95mSTEP 2:\u001b[0m Running the code above will print out a 'Client ID'.\n",
"♫♫♫ > Have your duet partner send it to you and enter it below!\n",
"\n",
"♫♫♫ > Duet Partner's Client ID: e1cd7ecb8468f9605d675b357935d96a\n",
"♫♫♫ > Connecting...\n",
"♫♫♫ > ...using a running event loop...\n",
"\n",
"♫♫♫ > \u001b[92mCONNECTED!\u001b[0m\n",
"\n",
"♫♫♫ > DUET LIVE STATUS - Objects: 7 Requests: 0 Messages: 530 "
]
}
],
"source": [
"import syft as sy\n",
"duet1 = sy.duet(network_url=\"http://10.164.0.3:5000\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"duet1.requests.add_handler(\n",
" name=\"loss04\",\n",
" action=\"accept\",\n",
" element_quota=9\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<syft.proxy.torch.TensorPointer at 0x7f341e5a96a0>,\n",
" <syft.proxy.torch.TensorPointer at 0x7f341e5a9e80>)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Exception in callback AsyncIOEventEmitter._emit_run.<locals>._callback(<Task finishe...ent 'param'\")>) at /home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/pyee/_asyncio.py:55\n",
"handle: <Handle AsyncIOEventEmitter._emit_run.<locals>._callback(<Task finishe...ent 'param'\")>) at /home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/pyee/_asyncio.py:55>\n",
"Traceback (most recent call last):\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/nest_asyncio.py\", line 196, in run\n",
" ctx.run(self._callback, *self._args)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/pyee/_asyncio.py\", line 62, in _callback\n",
" self.emit('error', exc)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/pyee/_base.py\", line 116, in emit\n",
" self._emit_handle_potential_error(event, args[0] if args else None)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/pyee/_base.py\", line 86, in _emit_handle_potential_error\n",
" raise error\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/asyncio/tasks.py\", line 280, in __step\n",
" result = coro.send(None)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/grid/connections/webrtc.py\", line 208, in on_message\n",
" await self.consumer(msg=message)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/typeguard/__init__.py\", line 909, in async_wrapper\n",
" retval = await func(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/grid/connections/webrtc.py\", line 384, in consumer\n",
" raise e\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/grid/connections/webrtc.py\", line 368, in consumer\n",
" self.recv_immediate_msg_without_reply(msg=_msg)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/syft_decorator_impl.py\", line 31, in wrapper\n",
" return function(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/typecheck.py\", line 110, in decorator\n",
" return typechecked(decorated)(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/typeguard/__init__.py\", line 891, in wrapper\n",
" retval = func(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/grid/connections/webrtc.py\", line 428, in recv_immediate_msg_without_reply\n",
" raise e\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/grid/connections/webrtc.py\", line 421, in recv_immediate_msg_without_reply\n",
" self.node.recv_immediate_msg_without_reply(msg=msg)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/syft_decorator_impl.py\", line 31, in wrapper\n",
" return function(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/typecheck.py\", line 110, in decorator\n",
" return typechecked(decorated)(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/typeguard/__init__.py\", line 891, in wrapper\n",
" retval = func(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/core/node/common/node.py\", line 425, in recv_immediate_msg_without_reply\n",
" raise e\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/core/node/common/node.py\", line 396, in recv_immediate_msg_without_reply\n",
" self.process_message(\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/core/node/common/node.py\", line 479, in process_message\n",
" result = service.process(\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/syft_decorator_impl.py\", line 31, in wrapper\n",
" return function(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/decorators/typecheck.py\", line 110, in decorator\n",
" return typechecked(decorated)(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/typeguard/__init__.py\", line 891, in wrapper\n",
" retval = func(*args, **kwargs)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/core/node/common/service/obj_action_service.py\", line 26, in process\n",
" msg.execute_action(node=node, verify_key=verify_key)\n",
" File \"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/core/node/common/action/function_or_constructor_action.py\", line 115, in execute_action\n",
" result = method(*upcasted_args, **upcasted_kwargs)\n",
"TypeError: __init__() got an unexpected keyword argument 'param'\n",
"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/torch/autograd/__init__.py:130: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:100.)\n",
" Variable._execution_engine.run_backward(\n",
"/home/ivanmikhailovstudying/anaconda3/lib/python3.8/site-packages/syft/lib/torch/uppercase_tensor.py:37: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the gradient for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more informations.\n",
" grad = getattr(self.value, \"grad\", None)\n"
]
}
],
"source": [
"import torch as th\n",
"data = th.tensor(\n",
" [[1.0, 1.0],\n",
" [0.0, 1.0],\n",
" [1.0, 0.0],\n",
" [0.0, 0.0]]\n",
").tag(\"data\")\n",
"\n",
"data_ptr = data.send(duet1, searchable = True)\n",
"\n",
"target = th.tensor(\n",
" [[1.0],\n",
" [1.0],\n",
" [0.0],\n",
" [0.0]]\n",
").tag(\"target\")\n",
"\n",
"target_ptr = target.send(duet1, searchable=True)\n",
"data_ptr, target_ptr"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment