فهرست منبع

pr feedback

- defer closing llm on embedding
- do not override licenses
- remove debugging print line
- reformat model file docs
Bruce MacDonald 1 سال پیش
والد
کامیت
1bee2347be
2فایلهای تغییر یافته به همراه18 افزوده شده و 21 حذف شده
  1. 1 17
      docs/modelfile.md
  2. 17 4
      server/images.go

+ 1 - 17
docs/modelfile.md

@@ -103,9 +103,7 @@ EMBED <file path>
 The `PARAMETER` instruction defines a parameter that can be set when the model is run.
 
 ```
-
 PARAMETER <parameter> <parametervalue>
-
 ```
 
 ### Valid Parameters and Values
@@ -139,25 +137,19 @@ PARAMETER <parameter> <parametervalue>
 | `{{ .First }}`  | A boolean value used to render specific template information for the first generation of a session.          |
 
 ```
-
 TEMPLATE """
 {{- if .First }}
-
 ### System:
-
 {{ .System }}
 {{- end }}
 
 ### User:
-
 {{ .Prompt }}
 
 ### Response:
-
 """
 
 SYSTEM """<system message>"""
-
 ```
 
 ### SYSTEM
@@ -165,9 +157,7 @@ SYSTEM """<system message>"""
 The `SYSTEM` instruction specifies the system prompt to be used in the template, if applicable.
 
 ```
-
 SYSTEM """<system message>"""
-
 ```
 
 ### LICENSE
@@ -175,18 +165,12 @@ SYSTEM """<system message>"""
 The `LICENSE` instruction allows you to specify the legal license under which the model used with this Modelfile is shared or distributed.
 
 ```
-
 LICENSE """
 <license text>
 """
-
 ```
 
 ## Notes
 
 - the **modelfile is not case sensitive**. In the examples, we use uppercase for instructions to make it easier to distinguish it from arguments.
-- Instructions can be in any order. In the examples, we start with FROM instruction to keep it easily readable.
-
-```
-
-```
+- Instructions can be in any order. In the examples, we start with FROM instruction to keep it easily readable.

+ 17 - 4
server/images.go

@@ -303,13 +303,23 @@ func CreateModel(name string, path string, fn func(resp api.ProgressResponse)) e
 				}
 			}
 		case "embed":
-			// TODO: support entire directories here
 			embedFilePath, err := filenameWithPath(path, c.Args)
 			if err != nil {
 				return err
 			}
 			embed.files = append(embed.files, embedFilePath)
-		case "license", "template", "system", "prompt":
+		case "license":
+			fn(api.ProgressResponse{Status: fmt.Sprintf("creating model %s layer", c.Name)})
+			mediaType := fmt.Sprintf("application/vnd.ollama.image.%s", c.Name)
+
+			layer, err := CreateLayer(strings.NewReader(c.Args))
+			if err != nil {
+				return err
+			}
+
+			layer.MediaType = mediaType
+			layers = append(layers, layer)
+		case "template", "system", "prompt":
 			fn(api.ProgressResponse{Status: fmt.Sprintf("creating model %s layer", c.Name)})
 			// remove the prompt layer if one exists
 			mediaType := fmt.Sprintf("application/vnd.ollama.image.%s", c.Name)
@@ -354,8 +364,6 @@ func CreateModel(name string, path string, fn func(resp api.ProgressResponse)) e
 		embed.opts.FromMap(formattedParams)
 	}
 
-	fmt.Println(embed.model)
-
 	// generate the embedding layers
 	embeddingLayers, err := embeddingLayers(embed)
 	if err != nil {
@@ -426,6 +434,11 @@ func embeddingLayers(e EmbeddingParams) ([]*LayerReader, error) {
 		if err != nil {
 			return nil, fmt.Errorf("load model to generate embeddings: %v", err)
 		}
+		defer func() {
+			if llm != nil {
+				llm.Close()
+			}
+		}()
 
 		addedFiles := make(map[string]bool) // keep track of files that have already been added
 		for _, filePattern := range e.files {