Skip to content

Commit

Permalink
Merge branch 'ollama:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
likelovewant committed Aug 8, 2024
2 parents ca312b3 + 5b3a21b commit 26bd110
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 40 deletions.
9 changes: 6 additions & 3 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ curl http://localhost:11434/api/chat -d '{

```
curl http://localhost:11434/api/chat -d '{
"model": "mistral",
"model": "llama3.1",
"messages": [
{
"role": "user",
Expand Down Expand Up @@ -708,7 +708,7 @@ curl http://localhost:11434/api/chat -d '{

```json
{
"model": "mistral:7b-instruct-v0.3-q4_K_M",
"model": "llama3.1",
"created_at": "2024-07-22T20:33:28.123648Z",
"message": {
"role": "assistant",
Expand Down Expand Up @@ -1175,7 +1175,10 @@ curl http://localhost:11434/api/embed -d '{
"embeddings": [[
0.010071029, -0.0017594862, 0.05007221, 0.04692972, 0.054916814,
0.008599704, 0.105441414, -0.025878139, 0.12958129, 0.031952348
]]
]],
"total_duration": 14143917,
"load_duration": 1019500,
"prompt_eval_count": 8
}
```

Expand Down
45 changes: 27 additions & 18 deletions server/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,19 +250,21 @@ func GetModel(name string) (*Model, error) {
Template: template.DefaultTemplate,
}

filename, err := GetBlobsPath(manifest.Config.Digest)
if err != nil {
return nil, err
}
if manifest.Config.Digest != "" {
filename, err := GetBlobsPath(manifest.Config.Digest)
if err != nil {
return nil, err
}

configFile, err := os.Open(filename)
if err != nil {
return nil, err
}
defer configFile.Close()
configFile, err := os.Open(filename)
if err != nil {
return nil, err
}
defer configFile.Close()

if err := json.NewDecoder(configFile).Decode(&model.Config); err != nil {
return nil, err
if err := json.NewDecoder(configFile).Decode(&model.Config); err != nil {
return nil, err
}
}

for _, layer := range manifest.Layers {
Expand Down Expand Up @@ -714,8 +716,7 @@ func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]struct{})
// save (i.e. delete from the deleteMap) any files used in other manifests
manifest, _, err := GetManifest(fmp)
if err != nil {
//nolint:nilerr
return nil
return err
}

for _, layer := range manifest.Layers {
Expand Down Expand Up @@ -782,7 +783,8 @@ func PruneLayers() error {

err = deleteUnusedLayers(nil, deleteMap)
if err != nil {
return err
slog.Error(fmt.Sprintf("couldn't remove unused layers: %v", err))
return nil
}

slog.Info(fmt.Sprintf("total unused blobs removed: %d", len(deleteMap)))
Expand Down Expand Up @@ -839,7 +841,9 @@ func PushModel(ctx context.Context, name string, regOpts *registryOptions, fn fu

var layers []*Layer
layers = append(layers, manifest.Layers...)
layers = append(layers, manifest.Config)
if manifest.Config.Digest != "" {
layers = append(layers, &manifest.Config)
}

for _, layer := range layers {
if err := uploadBlob(ctx, mp, layer, regOpts, fn); err != nil {
Expand Down Expand Up @@ -890,7 +894,9 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
for _, l := range manifest.Layers {
deleteMap[l.Digest] = struct{}{}
}
deleteMap[manifest.Config.Digest] = struct{}{}
if manifest.Config.Digest != "" {
deleteMap[manifest.Config.Digest] = struct{}{}
}
}
}

Expand All @@ -907,7 +913,9 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu

var layers []*Layer
layers = append(layers, manifest.Layers...)
layers = append(layers, manifest.Config)
if manifest.Config.Digest != "" {
layers = append(layers, &manifest.Config)
}

skipVerify := make(map[string]bool)
for _, layer := range layers {
Expand Down Expand Up @@ -971,7 +979,8 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
fn(api.ProgressResponse{Status: "removing any unused layers"})
err = deleteUnusedLayers(nil, deleteMap)
if err != nil {
return err
slog.Error(fmt.Sprintf("couldn't remove unused layers: %v", err))
fn(api.ProgressResponse{Status: fmt.Sprintf("couldn't remove unused layers: %v", err)})
}
}

Expand Down
15 changes: 14 additions & 1 deletion server/layer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package server

import (
"crypto/sha256"
"errors"
"fmt"
"io"
"os"
Expand Down Expand Up @@ -61,6 +62,10 @@ func NewLayer(r io.Reader, mediatype string) (*Layer, error) {
}

func NewLayerFromLayer(digest, mediatype, from string) (*Layer, error) {
if digest == "" {
return nil, errors.New("creating new layer from layer with empty digest")
}

blob, err := GetBlobsPath(digest)
if err != nil {
return nil, err
Expand All @@ -81,6 +86,10 @@ func NewLayerFromLayer(digest, mediatype, from string) (*Layer, error) {
}

func (l *Layer) Open() (io.ReadSeekCloser, error) {
if l.Digest == "" {
return nil, errors.New("opening layer with empty digest")
}

blob, err := GetBlobsPath(l.Digest)
if err != nil {
return nil, err
Expand All @@ -90,13 +99,17 @@ func (l *Layer) Open() (io.ReadSeekCloser, error) {
}

func (l *Layer) Remove() error {
if l.Digest == "" {
return nil
}

ms, err := Manifests()
if err != nil {
return err
}

for _, m := range ms {
for _, layer := range append(m.Layers, m.Config) {
for _, layer := range append(m.Layers, &m.Config) {
if layer.Digest == l.Digest {
// something is using this layer
return nil
Expand Down
18 changes: 10 additions & 8 deletions server/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
type Manifest struct {
SchemaVersion int `json:"schemaVersion"`
MediaType string `json:"mediaType"`
Config *Layer `json:"config"`
Config Layer `json:"config"`
Layers []*Layer `json:"layers"`

filepath string
Expand All @@ -25,7 +25,7 @@ type Manifest struct {
}

func (m *Manifest) Size() (size int64) {
for _, layer := range append(m.Layers, m.Config) {
for _, layer := range append(m.Layers, &m.Config) {
size += layer.Size
}

Expand All @@ -46,11 +46,13 @@ func (m *Manifest) Remove() error {
}

func (m *Manifest) RemoveLayers() error {
for _, layer := range append(m.Layers, m.Config) {
if err := layer.Remove(); errors.Is(err, os.ErrNotExist) {
slog.Debug("layer does not exist", "digest", layer.Digest)
} else if err != nil {
return err
for _, layer := range append(m.Layers, &m.Config) {
if layer.Digest != "" {
if err := layer.Remove(); errors.Is(err, os.ErrNotExist) {
slog.Debug("layer does not exist", "digest", layer.Digest)
} else if err != nil {
return err
}
}
}

Expand Down Expand Up @@ -113,7 +115,7 @@ func WriteManifest(name model.Name, config *Layer, layers []*Layer) error {
m := Manifest{
SchemaVersion: 2,
MediaType: "application/vnd.docker.distribution.manifest.v2+json",
Config: config,
Config: *config,
Layers: layers,
}

Expand Down
23 changes: 13 additions & 10 deletions server/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -824,17 +824,20 @@ func (s *Server) ListModelsHandler(c *gin.Context) {

models := []api.ListModelResponse{}
for n, m := range ms {
f, err := m.Config.Open()
if err != nil {
slog.Warn("bad manifest filepath", "name", n, "error", err)
continue
}
defer f.Close()

var cf ConfigV2
if err := json.NewDecoder(f).Decode(&cf); err != nil {
slog.Warn("bad manifest config", "name", n, "error", err)
continue

if m.Config.Digest != "" {
f, err := m.Config.Open()
if err != nil {
slog.Warn("bad manifest filepath", "name", n, "error", err)
continue
}
defer f.Close()

if err := json.NewDecoder(f).Decode(&cf); err != nil {
slog.Warn("bad manifest config", "name", n, "error", err)
continue
}
}

// tag should never be masked
Expand Down

0 comments on commit 26bd110

Please sign in to comment.