Merge branch 'main' of github.com:abetlen/llama_cpp_python into main
This commit is contained in:
commit
9c41a3e990
4 changed files with 119 additions and 3 deletions
|
@ -17,6 +17,9 @@ This package provides:
|
||||||
|
|
||||||
Documentation is available at [https://abetlen.github.io/llama-cpp-python](https://abetlen.github.io/llama-cpp-python).
|
Documentation is available at [https://abetlen.github.io/llama-cpp-python](https://abetlen.github.io/llama-cpp-python).
|
||||||
|
|
||||||
|
Detailed MacOS Metal GPU install documentation is available at [docs/macos_install.md](docs/macos_install.md)
|
||||||
|
|
||||||
|
|
||||||
## Installation from PyPI (recommended)
|
## Installation from PyPI (recommended)
|
||||||
|
|
||||||
Install from PyPI (requires a c compiler):
|
Install from PyPI (requires a c compiler):
|
||||||
|
@ -25,7 +28,7 @@ Install from PyPI (requires a c compiler):
|
||||||
pip install llama-cpp-python
|
pip install llama-cpp-python
|
||||||
```
|
```
|
||||||
|
|
||||||
The above command will attempt to install the package and build build `llama.cpp` from source.
|
The above command will attempt to install the package and build `llama.cpp` from source.
|
||||||
This is the recommended installation method as it ensures that `llama.cpp` is built with the available optimizations for your system.
|
This is the recommended installation method as it ensures that `llama.cpp` is built with the available optimizations for your system.
|
||||||
|
|
||||||
If you have previously installed `llama-cpp-python` through pip and want to upgrade your version or rebuild the package with different compiler options, please add the following flags to ensure that the package is rebuilt correctly:
|
If you have previously installed `llama-cpp-python` through pip and want to upgrade your version or rebuild the package with different compiler options, please add the following flags to ensure that the package is rebuilt correctly:
|
||||||
|
|
62
docs/macos_install.md
Normal file
62
docs/macos_install.md
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
# llama-cpp-python - MacOS Install with Metal GPU
|
||||||
|
|
||||||
|
|
||||||
|
**(1) Make sure you have xcode installed... at least the command line parts**
|
||||||
|
```
|
||||||
|
# check the path of your xcode install
|
||||||
|
xcode-select -p
|
||||||
|
|
||||||
|
# xcode installed returns
|
||||||
|
# /Applications/Xcode-beta.app/Contents/Developer
|
||||||
|
|
||||||
|
# if xcode is missing then install it... it takes ages;
|
||||||
|
xcode-select --install
|
||||||
|
```
|
||||||
|
|
||||||
|
**(2) Install the conda version for MacOS that supports Metal GPU**
|
||||||
|
```
|
||||||
|
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
|
||||||
|
bash Miniforge3-MacOSX-arm64.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**(3) Make a conda environment**
|
||||||
|
```
|
||||||
|
conda create -n llama python=3.9.16
|
||||||
|
conda activate llama
|
||||||
|
```
|
||||||
|
|
||||||
|
**(4) Install the LATEST llama-cpp-python.. which, as of just today, happily supports MacOS Metal GPU**
|
||||||
|
*(you needed xcode installed in order pip to build/compile the C++ code)*
|
||||||
|
```
|
||||||
|
pip uninstall llama-cpp-python -y
|
||||||
|
CMAKE_ARGS="-DLLAMA_METAL=on" FORCE_CMAKE=1 pip install -U llama-cpp-python --no-cache-dir
|
||||||
|
pip install 'llama-cpp-python[server]'
|
||||||
|
|
||||||
|
# you should now have llama-cpp-python v0.1.62 installed
|
||||||
|
llama-cpp-python 0.1.62
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**(4) Download a v3 ggml llama/vicuna/alpaca model**
|
||||||
|
- **ggmlv3**
|
||||||
|
- file name ends with **q4_0.bin** - indicating it is 4bit quantized, with quantisation method 0
|
||||||
|
|
||||||
|
https://huggingface.co/vicuna/ggml-vicuna-13b-1.1/blob/main/ggml-vic13b-q4_0.bin
|
||||||
|
https://huggingface.co/vicuna/ggml-vicuna-13b-1.1/blob/main/ggml-vic13b-uncensored-q4_0.bin
|
||||||
|
https://huggingface.co/TheBloke/LLaMa-7B-GGML/blob/main/llama-7b.ggmlv3.q4_0.bin
|
||||||
|
https://huggingface.co/TheBloke/LLaMa-13B-GGML/blob/main/llama-13b.ggmlv3.q4_0.bin
|
||||||
|
|
||||||
|
|
||||||
|
**(6) run the llama-cpp-python API server with MacOS Metal GPU support**
|
||||||
|
```
|
||||||
|
# config your ggml model path
|
||||||
|
# make sure it is ggml v3
|
||||||
|
# make sure it is q4_0
|
||||||
|
export MODEL=[path to your llama.cpp ggml models]]/[ggml-model-name]]q4_0.bin
|
||||||
|
python3 -m llama_cpp.server --model $MODEL --n_gpu_layers 1
|
||||||
|
```
|
||||||
|
|
||||||
|
***Note:** If you omit the `--n_gpu_layers 1` then CPU will be used*
|
||||||
|
|
||||||
|
|
|
@ -1378,6 +1378,7 @@ class Llama:
|
||||||
mirostat_tau: float = 5.0,
|
mirostat_tau: float = 5.0,
|
||||||
mirostat_eta: float = 0.1,
|
mirostat_eta: float = 0.1,
|
||||||
model: Optional[str] = None,
|
model: Optional[str] = None,
|
||||||
|
logits_processor: Optional[LogitsProcessorList] = None,
|
||||||
) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]:
|
) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]:
|
||||||
"""Generate a chat completion from a list of messages.
|
"""Generate a chat completion from a list of messages.
|
||||||
|
|
||||||
|
@ -1419,6 +1420,7 @@ class Llama:
|
||||||
mirostat_tau=mirostat_tau,
|
mirostat_tau=mirostat_tau,
|
||||||
mirostat_eta=mirostat_eta,
|
mirostat_eta=mirostat_eta,
|
||||||
model=model,
|
model=model,
|
||||||
|
logits_processor=logits_processor,
|
||||||
)
|
)
|
||||||
if stream:
|
if stream:
|
||||||
chunks: Iterator[CompletionChunk] = completion_or_chunks # type: ignore
|
chunks: Iterator[CompletionChunk] = completion_or_chunks # type: ignore
|
||||||
|
|
|
@ -259,13 +259,14 @@ class CreateCompletionRequest(BaseModel):
|
||||||
)
|
)
|
||||||
presence_penalty: Optional[float] = presence_penalty_field
|
presence_penalty: Optional[float] = presence_penalty_field
|
||||||
frequency_penalty: Optional[float] = frequency_penalty_field
|
frequency_penalty: Optional[float] = frequency_penalty_field
|
||||||
|
logit_bias: Optional[Dict[str, float]] = Field(None)
|
||||||
|
logit_bias_type: Optional[Literal["input_ids", "tokens"]] = Field(None)
|
||||||
|
|
||||||
# ignored or currently unsupported
|
# ignored or currently unsupported
|
||||||
model: Optional[str] = model_field
|
model: Optional[str] = model_field
|
||||||
n: Optional[int] = 1
|
n: Optional[int] = 1
|
||||||
logprobs: Optional[int] = Field(None)
|
logprobs: Optional[int] = Field(None)
|
||||||
best_of: Optional[int] = 1
|
best_of: Optional[int] = 1
|
||||||
logit_bias: Optional[Dict[str, float]] = Field(None)
|
|
||||||
user: Optional[str] = Field(None)
|
user: Optional[str] = Field(None)
|
||||||
|
|
||||||
# llama.cpp specific parameters
|
# llama.cpp specific parameters
|
||||||
|
@ -284,6 +285,39 @@ class CreateCompletionRequest(BaseModel):
|
||||||
CreateCompletionResponse = create_model_from_typeddict(llama_cpp.Completion)
|
CreateCompletionResponse = create_model_from_typeddict(llama_cpp.Completion)
|
||||||
|
|
||||||
|
|
||||||
|
def make_logit_bias_processor(
|
||||||
|
llama: llama_cpp.Llama,
|
||||||
|
logit_bias: Dict[str, float],
|
||||||
|
logit_bias_type: Optional[Literal["input_ids", "tokens"]],
|
||||||
|
):
|
||||||
|
if logit_bias_type is None:
|
||||||
|
logit_bias_type = "input_ids"
|
||||||
|
|
||||||
|
to_bias: Dict[int, float] = {}
|
||||||
|
if logit_bias_type == "input_ids":
|
||||||
|
for input_id, score in logit_bias.items():
|
||||||
|
input_id = int(input_id)
|
||||||
|
to_bias[input_id] = score
|
||||||
|
|
||||||
|
elif logit_bias_type == "tokens":
|
||||||
|
for token, score in logit_bias.items():
|
||||||
|
token = token.encode('utf-8')
|
||||||
|
for input_id in llama.tokenize(token, add_bos=False):
|
||||||
|
to_bias[input_id] = score
|
||||||
|
|
||||||
|
def logit_bias_processor(
|
||||||
|
input_ids: List[int],
|
||||||
|
scores: List[float],
|
||||||
|
) -> List[float]:
|
||||||
|
new_scores = [None] * len(scores)
|
||||||
|
for input_id, score in enumerate(scores):
|
||||||
|
new_scores[input_id] = score + to_bias.get(input_id, 0.0)
|
||||||
|
|
||||||
|
return new_scores
|
||||||
|
|
||||||
|
return logit_bias_processor
|
||||||
|
|
||||||
|
|
||||||
@router.post(
|
@router.post(
|
||||||
"/v1/completions",
|
"/v1/completions",
|
||||||
response_model=CreateCompletionResponse,
|
response_model=CreateCompletionResponse,
|
||||||
|
@ -301,9 +335,16 @@ async def create_completion(
|
||||||
"n",
|
"n",
|
||||||
"best_of",
|
"best_of",
|
||||||
"logit_bias",
|
"logit_bias",
|
||||||
|
"logit_bias_type",
|
||||||
"user",
|
"user",
|
||||||
}
|
}
|
||||||
kwargs = body.dict(exclude=exclude)
|
kwargs = body.dict(exclude=exclude)
|
||||||
|
|
||||||
|
if body.logit_bias is not None:
|
||||||
|
kwargs['logits_processor'] = llama_cpp.LogitsProcessorList([
|
||||||
|
make_logit_bias_processor(llama, body.logit_bias, body.logit_bias_type),
|
||||||
|
])
|
||||||
|
|
||||||
if body.stream:
|
if body.stream:
|
||||||
send_chan, recv_chan = anyio.create_memory_object_stream(10)
|
send_chan, recv_chan = anyio.create_memory_object_stream(10)
|
||||||
|
|
||||||
|
@ -382,11 +423,12 @@ class CreateChatCompletionRequest(BaseModel):
|
||||||
stream: bool = stream_field
|
stream: bool = stream_field
|
||||||
presence_penalty: Optional[float] = presence_penalty_field
|
presence_penalty: Optional[float] = presence_penalty_field
|
||||||
frequency_penalty: Optional[float] = frequency_penalty_field
|
frequency_penalty: Optional[float] = frequency_penalty_field
|
||||||
|
logit_bias: Optional[Dict[str, float]] = Field(None)
|
||||||
|
logit_bias_type: Optional[Literal["input_ids", "tokens"]] = Field(None)
|
||||||
|
|
||||||
# ignored or currently unsupported
|
# ignored or currently unsupported
|
||||||
model: Optional[str] = model_field
|
model: Optional[str] = model_field
|
||||||
n: Optional[int] = 1
|
n: Optional[int] = 1
|
||||||
logit_bias: Optional[Dict[str, float]] = Field(None)
|
|
||||||
user: Optional[str] = Field(None)
|
user: Optional[str] = Field(None)
|
||||||
|
|
||||||
# llama.cpp specific parameters
|
# llama.cpp specific parameters
|
||||||
|
@ -423,9 +465,16 @@ async def create_chat_completion(
|
||||||
exclude = {
|
exclude = {
|
||||||
"n",
|
"n",
|
||||||
"logit_bias",
|
"logit_bias",
|
||||||
|
"logit_bias_type",
|
||||||
"user",
|
"user",
|
||||||
}
|
}
|
||||||
kwargs = body.dict(exclude=exclude)
|
kwargs = body.dict(exclude=exclude)
|
||||||
|
|
||||||
|
if body.logit_bias is not None:
|
||||||
|
kwargs['logits_processor'] = llama_cpp.LogitsProcessorList([
|
||||||
|
make_logit_bias_processor(llama, body.logit_bias, body.logit_bias_type),
|
||||||
|
])
|
||||||
|
|
||||||
if body.stream:
|
if body.stream:
|
||||||
send_chan, recv_chan = anyio.create_memory_object_stream(10)
|
send_chan, recv_chan = anyio.create_memory_object_stream(10)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue