瀏覽代碼

simplify loading

Bruce MacDonald 1 年之前
父節點
當前提交
ecfb4abafb
共有 5 個文件被更改,包括 39 次插入39 次删除
  1. 12 3
      docs/development.md
  2. 0 1
      models/.gitignore
  3. 0 9
      models/README.txt
  4. 22 23
      ollama.py
  5. 5 3
      requirements.txt

+ 12 - 3
docs/development.md

@@ -10,7 +10,7 @@ Install dependencies:
 pip install -r requirements.txt
 ```
 
-Put your model in `models/` and run:
+Run a server:
 
 ```
 python3 ollama.py serve
@@ -19,17 +19,18 @@ python3 ollama.py serve
 **Start frontend service:**
 
 Install dependencies:
+
 ```
 cd desktop
 npm install
 ```
 
-Run the UI: 
+Run the UI:
+
 ```
 npm start
 ```
 
-
 ## Building
 
 If using Apple silicon, you need a Python version that supports arm64:
@@ -57,3 +58,11 @@ python3 build.py
 cd desktop
 npm run package
 ```
+
+## Update requirements.txt
+
+In the root directory, run:
+
+```
+pipreqs . --force
+```

+ 0 - 1
models/.gitignore

@@ -1 +0,0 @@
-*.bin

+ 0 - 9
models/README.txt

@@ -1,9 +0,0 @@
-Place models here for use.
-
-Here's some recommendations:
-https://huggingface.co/TheBloke/vicuna-7B-v1.3-GGML
-
-
-https://huggingface.co/TheBloke/orca_mini_3B-GGML/resolve/main/orca-mini-3b.ggmlv3.q4_1.bin
-
-https://huggingface.co/TheBloke/orca_mini_13B-GGML/resolve/main/orca-mini-13b.ggmlv3.q4_1.bin

+ 22 - 23
ollama.py

@@ -27,47 +27,46 @@ def models_directory():
     return models_dir
 
 
-def load(model=None, path=None):
+def load(model):
     """
     Load a model.
 
-    The model can be specified by providing either the path or the model name,
-    but not both. If both are provided, this function will raise a ValueError.
-    If the model does not exist or could not be loaded, this function returns an error.
-
     Args:
-    model (str, optional): The name of the model to load.
-    path (str, optional): The path to the model file.
+    model (str): The name or path of the model to load.
 
     Returns:
+    str or None: The name of the model
     dict or None: If the model cannot be loaded, a dictionary with an 'error' key is returned.
                   If the model is successfully loaded, None is returned.
     """
 
     with lock:
-        if path is not None and model is not None:
-            raise ValueError(
-                "Both path and model are specified. Please provide only one of them."
-            )
-        elif path is not None:
-            name = os.path.basename(path)
+        load_from = ""
+        if os.path.exists(model) and model.endswith(".bin"):
+            # model is being referenced by path rather than name directly
+            path = os.path.abspath(model)
+            base = os.path.basename(path)
+
             load_from = path
-        elif model is not None:
-            name = model
+            name = os.path.splitext(base)[0]  # Split the filename and extension
+        else:
+            # model is being loaded from the ollama models directory
             dir = models_directory()
+
+            # TODO: download model from a repository if it does not exist
             load_from = str(dir / f"{model}.bin")
-        else:
-            raise ValueError("Either path or model must be specified.")
+            name = model
+
+        if load_from == "":
+            return None, {"error": "Model not found."}
 
         if not os.path.exists(load_from):
-            return {"error": f"The model at {load_from} does not exist."}
+            return None, {"error": f"The model {load_from} does not exist."}
 
         if name not in llms:
-            # TODO: download model from a repository if it does not exist
             llms[name] = Llama(model_path=load_from)
 
-    # TODO: this should start a persistent instance of ollama with the model loaded
-    return None
+    return name, None
 
 
 def unload(model):
@@ -84,10 +83,10 @@ def unload(model):
 
 def generate(model, prompt):
     # auto load
-    error = load(model)
+    name, error = load(model)
     if error is not None:
         return error
-    generated = llms[model](
+    generated = llms[name](
         str(prompt),  # TODO: optimize prompt based on model
         max_tokens=4096,
         stop=["Q:", "\n"],

+ 5 - 3
requirements.txt

@@ -1,5 +1,7 @@
+click==8.1.3
 Flask==2.3.2
-flask_cors==3.0.10
-llama-cpp-python==0.1.65
+Flask_Cors==3.0.10
+llama_cpp_python==0.1.65
 pyinstaller==5.13.0
-pyinstaller-hooks-contrib==2023.3
+setuptools==65.6.3
+tqdm==4.65.0