Skip to content

Instantly share code, notes, and snippets.

@stsievert
Last active August 17, 2018 15:27
Show Gist options
  • Save stsievert/4f593614450a143bf1b342e1fdeadce9 to your computer and use it in GitHub Desktop.
Save stsievert/4f593614450a143bf1b342e1fdeadce9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.22.0+64.ge5792a34.dirty'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from distributed import Client\n",
"from distributed.protocol import register_generic\n",
"import distributed\n",
"client = Client()\n",
"distributed.__version__"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
},
{
"data": {
"text/plain": [
"'2.2.0'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import keras\n",
"keras.__version__"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.5.3'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import cloudpickle\n",
"cloudpickle.__version__"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def setup(return_x_y=False):\n",
" from keras.datasets import mnist\n",
" from keras.models import Sequential\n",
" from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D\n",
" from keras import backend as K\n",
" import keras\n",
" img_rows, img_cols = 28, 28\n",
" (x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
"\n",
" x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
" x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
" input_shape = (img_rows, img_cols, 1)\n",
"\n",
" x_train = x_train.astype('float32') / 255\n",
" x_test = x_test.astype('float32') / 255\n",
" y_train = keras.utils.to_categorical(y_train, 10)\n",
" y_test = keras.utils.to_categorical(y_test, 10)\n",
" if return_x_y:\n",
" return x_train, y_train\n",
"\n",
" model = Sequential()\n",
" model.add(Conv2D(32, kernel_size=(3, 3),\n",
" activation='relu',\n",
" input_shape=input_shape))\n",
" model.add(Conv2D(64, (3, 3), activation='relu'))\n",
" model.add(MaxPooling2D(pool_size=(2, 2)))\n",
" model.add(Dropout(0.25))\n",
" model.add(Flatten())\n",
" model.add(Dense(128, activation='relu'))\n",
" model.add(Dropout(0.5))\n",
" model.add(Dense(10, activation='softmax'))\n",
" return model, x_train, y_train"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"from distributed.protocol import serialize, deserialize\n",
"model, _, _ = setup()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[keras.engine.sequential.Sequential,\n",
" keras.engine.training.Model,\n",
" keras.engine.network.Network,\n",
" keras.engine.base_layer.Layer,\n",
" object]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(model).mro()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"header, frames = serialize(model)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "Could not serialize object of type Sequential\nTraceback (most recent call last):\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/pickle.py\", line 38, in dumps\n result = pickle.dumps(x, protocol=pickle.HIGHEST_PROTOCOL)\nTypeError: can't pickle _thread.RLock objects\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\", line 133, in serialize\n header, frames = dumps(x, context=context) if wants_context else dumps(x)\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\", line 53, in pickle_dumps\n return {'serializer': 'pickle'}, [pickle.dumps(x)]\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/pickle.py\", line 51, in dumps\n return cloudpickle.dumps(x, protocol=pickle.HIGHEST_PROTOCOL)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/site-packages/cloudpickle/cloudpickle.py\", line 895, in dumps\n cp.dump(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/site-packages/cloudpickle/cloudpickle.py\", line 268, in dump\n return Pickler.dump(self, obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 409, in dump\n self.save(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 805, in _batch_appends\n save(x)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 808, in _batch_appends\n save(tmp[0])\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 808, in _batch_appends\n save(tmp[0])\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 496, in save\n rv = reduce(self.proto)\nTypeError: can't pickle _thread.RLock objects\n",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-9-67db29f85d6b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeserialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mdeserialize\u001b[0;34m(header, frames, deserializers)\u001b[0m\n\u001b[1;32m 171\u001b[0m \"data with %s\" % (name, str(list(deserializers))))\n\u001b[1;32m 172\u001b[0m \u001b[0mdumps\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloads\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwants_context\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfamilies\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 173\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 174\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mserialization_error_loads\u001b[0;34m(header, frames)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mserialization_error_loads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'\\n'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'utf8'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mframe\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: Could not serialize object of type Sequential\nTraceback (most recent call last):\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/pickle.py\", line 38, in dumps\n result = pickle.dumps(x, protocol=pickle.HIGHEST_PROTOCOL)\nTypeError: can't pickle _thread.RLock objects\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\", line 133, in serialize\n header, frames = dumps(x, context=context) if wants_context else dumps(x)\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/serialize.py\", line 53, in pickle_dumps\n return {'serializer': 'pickle'}, [pickle.dumps(x)]\n File \"/Users/ssievert/Developer/mrocklin/distributed/distributed/protocol/pickle.py\", line 51, in dumps\n return cloudpickle.dumps(x, protocol=pickle.HIGHEST_PROTOCOL)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/site-packages/cloudpickle/cloudpickle.py\", line 895, in dumps\n cp.dump(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/site-packages/cloudpickle/cloudpickle.py\", line 268, in dump\n return Pickler.dump(self, obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 409, in dump\n self.save(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 805, in _batch_appends\n save(x)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 808, in _batch_appends\n save(tmp[0])\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 781, in save_list\n self._batch_appends(obj)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 808, in _batch_appends\n save(tmp[0])\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 521, in save\n self.save_reduce(obj=obj, *rv)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 634, in save_reduce\n save(state)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 476, in save\n f(self, obj) # Call unbound method with explicit self\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 821, in save_dict\n self._batch_setitems(obj.items())\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 847, in _batch_setitems\n save(v)\n File \"/Users/ssievert/anaconda3/envs/dask-master/lib/python3.6/pickle.py\", line 496, in save\n rv = reduce(self.proto)\nTypeError: can't pickle _thread.RLock objects\n"
]
}
],
"source": [
"model2 = deserialize(header, frames)"
]
},
{
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment