We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
ENH: Add the option to use CPU to inference even there is GPU device
### Is your feature request related to a problem? Please describe
There is a GPU in my server, but when load some LLM model, I need load it into my memory because the model size is bigger
than GPU memory.

However, when I launch the model from web page, the N-GPU setting only contains auto, 0, 1 options, if I select 0, system will complain the following error:

> Server error: 400 - [address=0.0.0.0:19270, pid=2063850] The parameter `n_gpu` must be greater than 0 and not greater than the number of GPUs: 1 on the machine.

### Describe the solution you'd like
I think when the N GPU setting is set to 0, it should use CPU as inference device.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `xinference/device_utils.py`
Content:
```
1 # Copyright 2022-2023 XProbe Inc.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 import os
16 
17 import torch
18 from typing_extensions import Literal, Union
19 
20 DeviceType = Literal["cuda", "mps", "xpu", "cpu"]
21 
22 
23 def is_xpu_available() -> bool:
24     return hasattr(torch, "xpu") and torch.xpu.is_available()
25 
26 
27 def get_available_device() -> DeviceType:
28     if torch.cuda.is_available():
29         return "cuda"
30     elif torch.backends.mps.is_available():
31         return "mps"
32     elif is_xpu_available():
33         return "xpu"
34     return "cpu"
35 
36 
37 def is_device_available(device: str) -> bool:
38     if device == "cuda":
39         return torch.cuda.is_available()
40     elif device == "mps":
41         return torch.backends.mps.is_available()
42     elif device == "xpu":
43         return is_xpu_available()
44     elif device == "cpu":
45         return True
46 
47     return False
48 
49 
50 def move_model_to_available_device(model):
51     device = get_available_device()
52 
53     if device == "cpu":
54         return model
55 
56     return model.to(device)
57 
58 
59 def get_device_preferred_dtype(device: str) -> Union[torch.dtype, None]:
60     if device == "cpu":
61         return torch.float32
62     elif device == "cuda" or device == "mps":
63         return torch.float16
64     elif device == "xpu":
65         return torch.bfloat16
66 
67     return None
68 
69 
70 def is_hf_accelerate_supported(device: str) -> bool:
71     return device == "cuda" or device == "xpu"
72 
73 
74 def empty_cache():
75     if torch.cuda.is_available():
76         torch.cuda.empty_cache()
77     if torch.backends.mps.is_available():
78         torch.mps.empty_cache()
79     if is_xpu_available():
80         torch.xpu.empty_cache()
81 
82 
83 def gpu_count():
84     if torch.cuda.is_available():
85         cuda_visible_devices_env = os.getenv("CUDA_VISIBLE_DEVICES", None)
86 
87         if cuda_visible_devices_env is None:
88             return torch.cuda.device_count()
89 
90         cuda_visible_devices = (
91             cuda_visible_devices_env.split(",") if cuda_visible_devices_env else []
92         )
93 
94         return min(torch.cuda.device_count(), len(cuda_visible_devices))
95     elif torch.backends.mps.is_available():
96         return 1
97     elif is_xpu_available():
98         return torch.xpu.device_count()
99     else:
100         return 0
101
```
--- 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/xinference/device_utils.py b/xinference/device_utils.py
--- a/xinference/device_utils.py
+++ b/xinference/device_utils.py
@@ -92,8 +92,6 @@
         )
 
         return min(torch.cuda.device_count(), len(cuda_visible_devices))
-    elif torch.backends.mps.is_available():
-        return 1
     elif is_xpu_available():
         return torch.xpu.device_count()
     else:

{"golden_diff": "diff --git a/xinference/device_utils.py b/xinference/device_utils.py\n--- a/xinference/device_utils.py\n+++ b/xinference/device_utils.py\n@@ -92,8 +92,6 @@\n         )\n \n         return min(torch.cuda.device_count(), len(cuda_visible_devices))\n-    elif torch.backends.mps.is_available():\n-        return 1\n     elif is_xpu_available():\n         return torch.xpu.device_count()\n     else:\n", "issue": "ENH: Add the option to use CPU to inference even there is GPU device\n### Is your feature request related to a problem? Please describe\r\nThere is a GPU in my server, but when load some LLM model, I need load it into my memory because the model size is bigger\r\nthan GPU memory.\r\n\r\nHowever, when I launch the model from web page, the N-GPU setting only contains auto, 0, 1 options, if I select 0, system will complain the following error:\r\n\r\n> Server error: 400 - [address=0.0.0.0:19270, pid=2063850] The parameter `n_gpu` must be greater than 0 and not greater than the number of GPUs: 1 on the machine.\r\n\r\n### Describe the solution you'd like\r\nI think when the N GPU setting is set to 0, it should use CPU as inference device.\r\n\n", "before_files": [{"content": "# Copyright 2022-2023 XProbe Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport os\n\nimport torch\nfrom typing_extensions import Literal, Union\n\nDeviceType = Literal[\"cuda\", \"mps\", \"xpu\", \"cpu\"]\n\n\ndef is_xpu_available() -> bool:\n    return hasattr(torch, \"xpu\") and torch.xpu.is_available()\n\n\ndef get_available_device() -> DeviceType:\n    if torch.cuda.is_available():\n        return \"cuda\"\n    elif torch.backends.mps.is_available():\n        return \"mps\"\n    elif is_xpu_available():\n        return \"xpu\"\n    return \"cpu\"\n\n\ndef is_device_available(device: str) -> bool:\n    if device == \"cuda\":\n        return torch.cuda.is_available()\n    elif device == \"mps\":\n        return torch.backends.mps.is_available()\n    elif device == \"xpu\":\n        return is_xpu_available()\n    elif device == \"cpu\":\n        return True\n\n    return False\n\n\ndef move_model_to_available_device(model):\n    device = get_available_device()\n\n    if device == \"cpu\":\n        return model\n\n    return model.to(device)\n\n\ndef get_device_preferred_dtype(device: str) -> Union[torch.dtype, None]:\n    if device == \"cpu\":\n        return torch.float32\n    elif device == \"cuda\" or device == \"mps\":\n        return torch.float16\n    elif device == \"xpu\":\n        return torch.bfloat16\n\n    return None\n\n\ndef is_hf_accelerate_supported(device: str) -> bool:\n    return device == \"cuda\" or device == \"xpu\"\n\n\ndef empty_cache():\n    if torch.cuda.is_available():\n        torch.cuda.empty_cache()\n    if torch.backends.mps.is_available():\n        torch.mps.empty_cache()\n    if is_xpu_available():\n        torch.xpu.empty_cache()\n\n\ndef gpu_count():\n    if torch.cuda.is_available():\n        cuda_visible_devices_env = os.getenv(\"CUDA_VISIBLE_DEVICES\", None)\n\n        if cuda_visible_devices_env is None:\n            return torch.cuda.device_count()\n\n        cuda_visible_devices = (\n            cuda_visible_devices_env.split(\",\") if cuda_visible_devices_env else []\n        )\n\n        return min(torch.cuda.device_count(), len(cuda_visible_devices))\n    elif torch.backends.mps.is_available():\n        return 1\n    elif is_xpu_available():\n        return torch.xpu.device_count()\n    else:\n        return 0\n", "path": "xinference/device_utils.py"}], "after_files": [{"content": "# Copyright 2022-2023 XProbe Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport os\n\nimport torch\nfrom typing_extensions import Literal, Union\n\nDeviceType = Literal[\"cuda\", \"mps\", \"xpu\", \"cpu\"]\n\n\ndef is_xpu_available() -> bool:\n    return hasattr(torch, \"xpu\") and torch.xpu.is_available()\n\n\ndef get_available_device() -> DeviceType:\n    if torch.cuda.is_available():\n        return \"cuda\"\n    elif torch.backends.mps.is_available():\n        return \"mps\"\n    elif is_xpu_available():\n        return \"xpu\"\n    return \"cpu\"\n\n\ndef is_device_available(device: str) -> bool:\n    if device == \"cuda\":\n        return torch.cuda.is_available()\n    elif device == \"mps\":\n        return torch.backends.mps.is_available()\n    elif device == \"xpu\":\n        return is_xpu_available()\n    elif device == \"cpu\":\n        return True\n\n    return False\n\n\ndef move_model_to_available_device(model):\n    device = get_available_device()\n\n    if device == \"cpu\":\n        return model\n\n    return model.to(device)\n\n\ndef get_device_preferred_dtype(device: str) -> Union[torch.dtype, None]:\n    if device == \"cpu\":\n        return torch.float32\n    elif device == \"cuda\" or device == \"mps\":\n        return torch.float16\n    elif device == \"xpu\":\n        return torch.bfloat16\n\n    return None\n\n\ndef is_hf_accelerate_supported(device: str) -> bool:\n    return device == \"cuda\" or device == \"xpu\"\n\n\ndef empty_cache():\n    if torch.cuda.is_available():\n        torch.cuda.empty_cache()\n    if torch.backends.mps.is_available():\n        torch.mps.empty_cache()\n    if is_xpu_available():\n        torch.xpu.empty_cache()\n\n\ndef gpu_count():\n    if torch.cuda.is_available():\n        cuda_visible_devices_env = os.getenv(\"CUDA_VISIBLE_DEVICES\", None)\n\n        if cuda_visible_devices_env is None:\n            return torch.cuda.device_count()\n\n        cuda_visible_devices = (\n            cuda_visible_devices_env.split(\",\") if cuda_visible_devices_env else []\n        )\n\n        return min(torch.cuda.device_count(), len(cuda_visible_devices))\n    elif is_xpu_available():\n        return torch.xpu.device_count()\n    else:\n        return 0\n", "path": "xinference/device_utils.py"}]}