We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Fix parameter serialization
In some situations, parameters are not serialized properly. I suspect this is due to our implementation of parameter.data

Here is one example:
```python
class Net(sy.Plan):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 1)

    def forward(self, x):
        return self.fc1(x)

plan = Net()
plan.build(th.tensor([1.2]))

x = th.tensor([-1.0])
expected = plan(x)

plan.fix_precision().share(alice, bob, crypto_provider=charlie)
print(plan.state.tensors())
ptr_plan = plan.send(james)

# Fetch plan
fetched_plan = plan.owner.fetch_plan(ptr_plan.id_at_location, james)
print('***')
print(fetched_plan.state.tensors())
```
Output
```
[Parameter containing:
(Wrapper)>FixedPrecisionTensor>[AdditiveSharingTensor]
	-> [PointerTensor | me:94226517866 -> alice:74685210613]
	-> [PointerTensor | me:30028513485 -> bob:91228892047]
	*crypto provider: charlie*, Parameter containing:
(Wrapper)>FixedPrecisionTensor>[AdditiveSharingTensor]
	-> [PointerTensor | me:16955185561 -> alice:5015164314]
	-> [PointerTensor | me:77573712688 -> bob:21883177159]
	*crypto provider: charlie*]
***
[FixedPrecisionTensor>[AdditiveSharingTensor]
	-> [PointerTensor | me:94226517866 -> alice:74685210613]
	-> [PointerTensor | me:30028513485 -> bob:91228892047]
	*crypto provider: charlie*, FixedPrecisionTensor>[AdditiveSharingTensor]
	-> [PointerTensor | me:16955185561 -> alice:5015164314]
	-> [PointerTensor | me:77573712688 -> bob:21883177159]
	*crypto provider: charlie*]
```

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `syft/execution/placeholder.py`
Content:
```
1 import syft
2 from syft.generic.frameworks.hook import hook_args
3 from syft.execution.placeholder_id import PlaceholderId
4 from syft.generic.tensor import AbstractTensor
5 from syft.workers.abstract import AbstractWorker
6 from syft_proto.execution.v1.placeholder_pb2 import Placeholder as PlaceholderPB
7 
8 
9 class PlaceHolder(AbstractTensor):
10     def __init__(self, owner=None, id=None, tags: set = None, description: str = None):
11         """A PlaceHolder acts as a tensor but does nothing special. It can get
12         "instantiated" when a real tensor is appended as a child attribute. It
13         will send forward all the commands it receives to its child tensor.
14 
15         When you send a PlaceHolder, you don't sent the instantiated tensors.
16 
17         Args:
18             owner: An optional BaseWorker object to specify the worker on which
19                 the tensor is located.
20             id: An optional string or integer id of the PlaceHolder.
21         """
22         super().__init__(id=id, owner=owner, tags=tags, description=description)
23 
24         if not isinstance(self.id, PlaceholderId):
25             self.id = PlaceholderId(self.id)
26         self.child = None
27 
28     def instantiate(self, tensor):
29         """
30         Add a tensor as a child attribute. All operations on the placeholder will be also
31         executed on this child tensor.
32 
33         We remove wrappers or Placeholders if is there are any.
34         """
35         if isinstance(tensor, PlaceHolder):
36             self.child = tensor.child
37         elif tensor.is_wrapper:
38             self.instantiate(tensor.child)
39         else:
40             self.child = tensor
41         return self
42 
43     def __str__(self) -> str:
44         """
45         Compact representation of a Placeholder, including tags and optional child
46         """
47         tags = " ".join(list(self.tags or []))
48 
49         out = f"{type(self).__name__ }[Tags:{tags}]"
50 
51         if hasattr(self, "child") and self.child is not None:
52             out += f">{self.child}"
53 
54         return out
55 
56     __repr__ = __str__
57 
58     def copy(self):
59         """
60         Copying a placeholder doesn't duplicate the child attribute, because all
61         copy operations happen locally where we want to keep reference to the same
62         instantiated object. As the child doesn't get sent, this is not an issue.
63         """
64         placeholder = PlaceHolder(tags=self.tags, owner=self.owner)
65         placeholder.child = self.child
66         return placeholder
67 
68     @staticmethod
69     def simplify(worker: AbstractWorker, tensor: "PlaceHolder") -> tuple:
70         """Takes the attributes of a PlaceHolder and saves them in a tuple.
71 
72         Args:
73             worker: the worker doing the serialization
74             tensor: a PlaceHolder.
75 
76         Returns:
77             tuple: a tuple holding the unique attributes of the PlaceHolder.
78         """
79 
80         return (
81             syft.serde.msgpack.serde._simplify(worker, tensor.id),
82             syft.serde.msgpack.serde._simplify(worker, tensor.tags),
83             syft.serde.msgpack.serde._simplify(worker, tensor.description),
84         )
85 
86     @staticmethod
87     def detail(worker: AbstractWorker, tensor_tuple: tuple) -> "PlaceHolder":
88         """
89             This function reconstructs a PlaceHolder given it's attributes in form of a tuple.
90             Args:
91                 worker: the worker doing the deserialization
92                 tensor_tuple: a tuple holding the attributes of the PlaceHolder
93             Returns:
94                 PlaceHolder: a PlaceHolder
95             """
96 
97         tensor_id, tags, description = tensor_tuple
98 
99         tensor_id = syft.serde.msgpack.serde._detail(worker, tensor_id)
100         tags = syft.serde.msgpack.serde._detail(worker, tags)
101         description = syft.serde.msgpack.serde._detail(worker, description)
102 
103         return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)
104 
105     @staticmethod
106     def bufferize(worker: AbstractWorker, tensor: "PlaceHolder") -> PlaceholderPB:
107         """Takes the attributes of a PlaceHolder and saves them in a Protobuf message.
108 
109         Args:
110             worker: the worker doing the serialization
111             tensor: a PlaceHolder.
112 
113         Returns:
114             PlaceholderPB: a Protobuf message holding the unique attributes of the PlaceHolder.
115         """
116 
117         protobuf_placeholder = PlaceholderPB()
118         syft.serde.protobuf.proto.set_protobuf_id(protobuf_placeholder.id, tensor.id.value)
119         protobuf_placeholder.tags.extend(tensor.tags)
120 
121         if tensor.description:
122             protobuf_placeholder.description = tensor.description
123 
124         return protobuf_placeholder
125 
126     @staticmethod
127     def unbufferize(worker: AbstractWorker, protobuf_placeholder: PlaceholderPB) -> "PlaceHolder":
128         """
129             This function reconstructs a PlaceHolder given it's attributes in form of a Protobuf message.
130             Args:
131                 worker: the worker doing the deserialization
132                 protobuf_placeholder: a Protobuf message holding the attributes of the PlaceHolder
133             Returns:
134                 PlaceHolder: a PlaceHolder
135             """
136 
137         tensor_id = syft.serde.protobuf.proto.get_protobuf_id(protobuf_placeholder.id)
138         tags = set(protobuf_placeholder.tags)
139 
140         description = None
141         if bool(protobuf_placeholder.description):
142             description = protobuf_placeholder.description
143 
144         return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)
145 
146 
147 ### Register the tensor with hook_args.py ###
148 hook_args.default_register_tensor(PlaceHolder)
149
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/syft/execution/placeholder.py b/syft/execution/placeholder.py
--- a/syft/execution/placeholder.py
+++ b/syft/execution/placeholder.py
@@ -30,12 +30,10 @@
         Add a tensor as a child attribute. All operations on the placeholder will be also
         executed on this child tensor.
 
-        We remove wrappers or Placeholders if is there are any.
+        We remove Placeholders if is there are any.
         """
         if isinstance(tensor, PlaceHolder):
             self.child = tensor.child
-        elif tensor.is_wrapper:
-            self.instantiate(tensor.child)
         else:
             self.child = tensor
         return self

{"golden_diff": "diff --git a/syft/execution/placeholder.py b/syft/execution/placeholder.py\n--- a/syft/execution/placeholder.py\n+++ b/syft/execution/placeholder.py\n@@ -30,12 +30,10 @@\n         Add a tensor as a child attribute. All operations on the placeholder will be also\n         executed on this child tensor.\n \n-        We remove wrappers or Placeholders if is there are any.\n+        We remove Placeholders if is there are any.\n         \"\"\"\n         if isinstance(tensor, PlaceHolder):\n             self.child = tensor.child\n-        elif tensor.is_wrapper:\n-            self.instantiate(tensor.child)\n         else:\n             self.child = tensor\n         return self\n", "issue": "Fix parameter serialization\nIn some situations, parameters are not serialized properly. I suspect this is due to our implementation of parameter.data\r\n\r\nHere is one example:\r\n```python\r\nclass Net(sy.Plan):\r\n    def __init__(self):\r\n        super(Net, self).__init__()\r\n        self.fc1 = nn.Linear(1, 1)\r\n\r\n    def forward(self, x):\r\n        return self.fc1(x)\r\n\r\nplan = Net()\r\nplan.build(th.tensor([1.2]))\r\n\r\nx = th.tensor([-1.0])\r\nexpected = plan(x)\r\n\r\nplan.fix_precision().share(alice, bob, crypto_provider=charlie)\r\nprint(plan.state.tensors())\r\nptr_plan = plan.send(james)\r\n\r\n# Fetch plan\r\nfetched_plan = plan.owner.fetch_plan(ptr_plan.id_at_location, james)\r\nprint('***')\r\nprint(fetched_plan.state.tensors())\r\n```\r\nOutput\r\n```\r\n[Parameter containing:\r\n(Wrapper)>FixedPrecisionTensor>[AdditiveSharingTensor]\r\n\t-> [PointerTensor | me:94226517866 -> alice:74685210613]\r\n\t-> [PointerTensor | me:30028513485 -> bob:91228892047]\r\n\t*crypto provider: charlie*, Parameter containing:\r\n(Wrapper)>FixedPrecisionTensor>[AdditiveSharingTensor]\r\n\t-> [PointerTensor | me:16955185561 -> alice:5015164314]\r\n\t-> [PointerTensor | me:77573712688 -> bob:21883177159]\r\n\t*crypto provider: charlie*]\r\n***\r\n[FixedPrecisionTensor>[AdditiveSharingTensor]\r\n\t-> [PointerTensor | me:94226517866 -> alice:74685210613]\r\n\t-> [PointerTensor | me:30028513485 -> bob:91228892047]\r\n\t*crypto provider: charlie*, FixedPrecisionTensor>[AdditiveSharingTensor]\r\n\t-> [PointerTensor | me:16955185561 -> alice:5015164314]\r\n\t-> [PointerTensor | me:77573712688 -> bob:21883177159]\r\n\t*crypto provider: charlie*]\r\n```\n", "before_files": [{"content": "import syft\nfrom syft.generic.frameworks.hook import hook_args\nfrom syft.execution.placeholder_id import PlaceholderId\nfrom syft.generic.tensor import AbstractTensor\nfrom syft.workers.abstract import AbstractWorker\nfrom syft_proto.execution.v1.placeholder_pb2 import Placeholder as PlaceholderPB\n\n\nclass PlaceHolder(AbstractTensor):\n    def __init__(self, owner=None, id=None, tags: set = None, description: str = None):\n        \"\"\"A PlaceHolder acts as a tensor but does nothing special. It can get\n        \"instantiated\" when a real tensor is appended as a child attribute. It\n        will send forward all the commands it receives to its child tensor.\n\n        When you send a PlaceHolder, you don't sent the instantiated tensors.\n\n        Args:\n            owner: An optional BaseWorker object to specify the worker on which\n                the tensor is located.\n            id: An optional string or integer id of the PlaceHolder.\n        \"\"\"\n        super().__init__(id=id, owner=owner, tags=tags, description=description)\n\n        if not isinstance(self.id, PlaceholderId):\n            self.id = PlaceholderId(self.id)\n        self.child = None\n\n    def instantiate(self, tensor):\n        \"\"\"\n        Add a tensor as a child attribute. All operations on the placeholder will be also\n        executed on this child tensor.\n\n        We remove wrappers or Placeholders if is there are any.\n        \"\"\"\n        if isinstance(tensor, PlaceHolder):\n            self.child = tensor.child\n        elif tensor.is_wrapper:\n            self.instantiate(tensor.child)\n        else:\n            self.child = tensor\n        return self\n\n    def __str__(self) -> str:\n        \"\"\"\n        Compact representation of a Placeholder, including tags and optional child\n        \"\"\"\n        tags = \" \".join(list(self.tags or []))\n\n        out = f\"{type(self).__name__ }[Tags:{tags}]\"\n\n        if hasattr(self, \"child\") and self.child is not None:\n            out += f\">{self.child}\"\n\n        return out\n\n    __repr__ = __str__\n\n    def copy(self):\n        \"\"\"\n        Copying a placeholder doesn't duplicate the child attribute, because all\n        copy operations happen locally where we want to keep reference to the same\n        instantiated object. As the child doesn't get sent, this is not an issue.\n        \"\"\"\n        placeholder = PlaceHolder(tags=self.tags, owner=self.owner)\n        placeholder.child = self.child\n        return placeholder\n\n    @staticmethod\n    def simplify(worker: AbstractWorker, tensor: \"PlaceHolder\") -> tuple:\n        \"\"\"Takes the attributes of a PlaceHolder and saves them in a tuple.\n\n        Args:\n            worker: the worker doing the serialization\n            tensor: a PlaceHolder.\n\n        Returns:\n            tuple: a tuple holding the unique attributes of the PlaceHolder.\n        \"\"\"\n\n        return (\n            syft.serde.msgpack.serde._simplify(worker, tensor.id),\n            syft.serde.msgpack.serde._simplify(worker, tensor.tags),\n            syft.serde.msgpack.serde._simplify(worker, tensor.description),\n        )\n\n    @staticmethod\n    def detail(worker: AbstractWorker, tensor_tuple: tuple) -> \"PlaceHolder\":\n        \"\"\"\n            This function reconstructs a PlaceHolder given it's attributes in form of a tuple.\n            Args:\n                worker: the worker doing the deserialization\n                tensor_tuple: a tuple holding the attributes of the PlaceHolder\n            Returns:\n                PlaceHolder: a PlaceHolder\n            \"\"\"\n\n        tensor_id, tags, description = tensor_tuple\n\n        tensor_id = syft.serde.msgpack.serde._detail(worker, tensor_id)\n        tags = syft.serde.msgpack.serde._detail(worker, tags)\n        description = syft.serde.msgpack.serde._detail(worker, description)\n\n        return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)\n\n    @staticmethod\n    def bufferize(worker: AbstractWorker, tensor: \"PlaceHolder\") -> PlaceholderPB:\n        \"\"\"Takes the attributes of a PlaceHolder and saves them in a Protobuf message.\n\n        Args:\n            worker: the worker doing the serialization\n            tensor: a PlaceHolder.\n\n        Returns:\n            PlaceholderPB: a Protobuf message holding the unique attributes of the PlaceHolder.\n        \"\"\"\n\n        protobuf_placeholder = PlaceholderPB()\n        syft.serde.protobuf.proto.set_protobuf_id(protobuf_placeholder.id, tensor.id.value)\n        protobuf_placeholder.tags.extend(tensor.tags)\n\n        if tensor.description:\n            protobuf_placeholder.description = tensor.description\n\n        return protobuf_placeholder\n\n    @staticmethod\n    def unbufferize(worker: AbstractWorker, protobuf_placeholder: PlaceholderPB) -> \"PlaceHolder\":\n        \"\"\"\n            This function reconstructs a PlaceHolder given it's attributes in form of a Protobuf message.\n            Args:\n                worker: the worker doing the deserialization\n                protobuf_placeholder: a Protobuf message holding the attributes of the PlaceHolder\n            Returns:\n                PlaceHolder: a PlaceHolder\n            \"\"\"\n\n        tensor_id = syft.serde.protobuf.proto.get_protobuf_id(protobuf_placeholder.id)\n        tags = set(protobuf_placeholder.tags)\n\n        description = None\n        if bool(protobuf_placeholder.description):\n            description = protobuf_placeholder.description\n\n        return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)\n\n\n### Register the tensor with hook_args.py ###\nhook_args.default_register_tensor(PlaceHolder)\n", "path": "syft/execution/placeholder.py"}], "after_files": [{"content": "import syft\nfrom syft.generic.frameworks.hook import hook_args\nfrom syft.execution.placeholder_id import PlaceholderId\nfrom syft.generic.tensor import AbstractTensor\nfrom syft.workers.abstract import AbstractWorker\nfrom syft_proto.execution.v1.placeholder_pb2 import Placeholder as PlaceholderPB\n\n\nclass PlaceHolder(AbstractTensor):\n    def __init__(self, owner=None, id=None, tags: set = None, description: str = None):\n        \"\"\"A PlaceHolder acts as a tensor but does nothing special. It can get\n        \"instantiated\" when a real tensor is appended as a child attribute. It\n        will send forward all the commands it receives to its child tensor.\n\n        When you send a PlaceHolder, you don't sent the instantiated tensors.\n\n        Args:\n            owner: An optional BaseWorker object to specify the worker on which\n                the tensor is located.\n            id: An optional string or integer id of the PlaceHolder.\n        \"\"\"\n        super().__init__(id=id, owner=owner, tags=tags, description=description)\n\n        if not isinstance(self.id, PlaceholderId):\n            self.id = PlaceholderId(self.id)\n        self.child = None\n\n    def instantiate(self, tensor):\n        \"\"\"\n        Add a tensor as a child attribute. All operations on the placeholder will be also\n        executed on this child tensor.\n\n        We remove Placeholders if is there are any.\n        \"\"\"\n        if isinstance(tensor, PlaceHolder):\n            self.child = tensor.child\n        else:\n            self.child = tensor\n        return self\n\n    def __str__(self) -> str:\n        \"\"\"\n        Compact representation of a Placeholder, including tags and optional child\n        \"\"\"\n        tags = \" \".join(list(self.tags or []))\n\n        out = f\"{type(self).__name__ }[Tags:{tags}]\"\n\n        if hasattr(self, \"child\") and self.child is not None:\n            out += f\">{self.child}\"\n\n        return out\n\n    __repr__ = __str__\n\n    def copy(self):\n        \"\"\"\n        Copying a placeholder doesn't duplicate the child attribute, because all\n        copy operations happen locally where we want to keep reference to the same\n        instantiated object. As the child doesn't get sent, this is not an issue.\n        \"\"\"\n        placeholder = PlaceHolder(tags=self.tags, owner=self.owner)\n        placeholder.child = self.child\n        return placeholder\n\n    @staticmethod\n    def simplify(worker: AbstractWorker, tensor: \"PlaceHolder\") -> tuple:\n        \"\"\"Takes the attributes of a PlaceHolder and saves them in a tuple.\n\n        Args:\n            worker: the worker doing the serialization\n            tensor: a PlaceHolder.\n\n        Returns:\n            tuple: a tuple holding the unique attributes of the PlaceHolder.\n        \"\"\"\n\n        return (\n            syft.serde.msgpack.serde._simplify(worker, tensor.id),\n            syft.serde.msgpack.serde._simplify(worker, tensor.tags),\n            syft.serde.msgpack.serde._simplify(worker, tensor.description),\n        )\n\n    @staticmethod\n    def detail(worker: AbstractWorker, tensor_tuple: tuple) -> \"PlaceHolder\":\n        \"\"\"\n            This function reconstructs a PlaceHolder given it's attributes in form of a tuple.\n            Args:\n                worker: the worker doing the deserialization\n                tensor_tuple: a tuple holding the attributes of the PlaceHolder\n            Returns:\n                PlaceHolder: a PlaceHolder\n            \"\"\"\n\n        tensor_id, tags, description = tensor_tuple\n\n        tensor_id = syft.serde.msgpack.serde._detail(worker, tensor_id)\n        tags = syft.serde.msgpack.serde._detail(worker, tags)\n        description = syft.serde.msgpack.serde._detail(worker, description)\n\n        return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)\n\n    @staticmethod\n    def bufferize(worker: AbstractWorker, tensor: \"PlaceHolder\") -> PlaceholderPB:\n        \"\"\"Takes the attributes of a PlaceHolder and saves them in a Protobuf message.\n\n        Args:\n            worker: the worker doing the serialization\n            tensor: a PlaceHolder.\n\n        Returns:\n            PlaceholderPB: a Protobuf message holding the unique attributes of the PlaceHolder.\n        \"\"\"\n\n        protobuf_placeholder = PlaceholderPB()\n        syft.serde.protobuf.proto.set_protobuf_id(protobuf_placeholder.id, tensor.id.value)\n        protobuf_placeholder.tags.extend(tensor.tags)\n\n        if tensor.description:\n            protobuf_placeholder.description = tensor.description\n\n        return protobuf_placeholder\n\n    @staticmethod\n    def unbufferize(worker: AbstractWorker, protobuf_placeholder: PlaceholderPB) -> \"PlaceHolder\":\n        \"\"\"\n            This function reconstructs a PlaceHolder given it's attributes in form of a Protobuf message.\n            Args:\n                worker: the worker doing the deserialization\n                protobuf_placeholder: a Protobuf message holding the attributes of the PlaceHolder\n            Returns:\n                PlaceHolder: a PlaceHolder\n            \"\"\"\n\n        tensor_id = syft.serde.protobuf.proto.get_protobuf_id(protobuf_placeholder.id)\n        tags = set(protobuf_placeholder.tags)\n\n        description = None\n        if bool(protobuf_placeholder.description):\n            description = protobuf_placeholder.description\n\n        return PlaceHolder(owner=worker, id=tensor_id, tags=tags, description=description)\n\n\n### Register the tensor with hook_args.py ###\nhook_args.default_register_tensor(PlaceHolder)\n", "path": "syft/execution/placeholder.py"}]}