Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
7d1c0047
Unverified
Commit
7d1c0047
authored
Aug 08, 2024
by
Jesse Gross
Committed by
GitHub
Aug 08, 2024
Browse files
Merge pull request #6247 from ollama/jessegross/layers
Store layers inside manifests consistently as values.
parents
5b3a21b5
7edaf6e7
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
36 additions
and
36 deletions
+36
-36
server/images.go
server/images.go
+10
-10
server/layer.go
server/layer.go
+14
-14
server/manifest.go
server/manifest.go
+8
-8
server/model.go
server/model.go
+1
-1
server/routes_delete_test.go
server/routes_delete_test.go
+1
-1
server/upload.go
server/upload.go
+2
-2
No files found.
server/images.go
View file @
7d1c0047
...
...
@@ -373,7 +373,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
var
messages
[]
*
api
.
Message
parameters
:=
make
(
map
[
string
]
any
)
var
layers
[]
*
Layer
var
layers
[]
Layer
for
_
,
c
:=
range
modelfile
.
Commands
{
mediatype
:=
fmt
.
Sprintf
(
"application/vnd.ollama.image.%s"
,
c
.
Name
)
...
...
@@ -499,7 +499,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
if
c
.
Name
!=
"license"
{
// replace
layers
=
slices
.
DeleteFunc
(
layers
,
func
(
layer
*
Layer
)
bool
{
layers
=
slices
.
DeleteFunc
(
layers
,
func
(
layer
Layer
)
bool
{
if
layer
.
MediaType
!=
mediatype
{
return
false
}
...
...
@@ -545,7 +545,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
}
var
err2
error
layers
=
slices
.
DeleteFunc
(
layers
,
func
(
layer
*
Layer
)
bool
{
layers
=
slices
.
DeleteFunc
(
layers
,
func
(
layer
Layer
)
bool
{
switch
layer
.
MediaType
{
case
"application/vnd.ollama.image.message"
:
// if there are new messages, remove the inherited ones
...
...
@@ -625,12 +625,12 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
return
err
}
l
ayer
,
err
:=
NewLayer
(
&
b
,
"application/vnd.docker.container.image.v1+json"
)
configL
ayer
,
err
:=
NewLayer
(
&
b
,
"application/vnd.docker.container.image.v1+json"
)
if
err
!=
nil
{
return
err
}
for
_
,
layer
:=
range
append
(
layers
,
l
ayer
)
{
for
_
,
layer
:=
range
append
(
layers
,
configL
ayer
)
{
if
layer
.
status
!=
""
{
fn
(
api
.
ProgressResponse
{
Status
:
layer
.
status
})
}
...
...
@@ -639,7 +639,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
old
,
_
:=
ParseNamedManifest
(
name
)
fn
(
api
.
ProgressResponse
{
Status
:
"writing manifest"
})
if
err
:=
WriteManifest
(
name
,
l
ayer
,
layers
);
err
!=
nil
{
if
err
:=
WriteManifest
(
name
,
configL
ayer
,
layers
);
err
!=
nil
{
return
err
}
...
...
@@ -839,10 +839,10 @@ func PushModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
return
err
}
var
layers
[]
*
Layer
var
layers
[]
Layer
layers
=
append
(
layers
,
manifest
.
Layers
...
)
if
manifest
.
Config
.
Digest
!=
""
{
layers
=
append
(
layers
,
&
manifest
.
Config
)
layers
=
append
(
layers
,
manifest
.
Config
)
}
for
_
,
layer
:=
range
layers
{
...
...
@@ -911,10 +911,10 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
return
fmt
.
Errorf
(
"pull model manifest: %s"
,
err
)
}
var
layers
[]
*
Layer
var
layers
[]
Layer
layers
=
append
(
layers
,
manifest
.
Layers
...
)
if
manifest
.
Config
.
Digest
!=
""
{
layers
=
append
(
layers
,
&
manifest
.
Config
)
layers
=
append
(
layers
,
manifest
.
Config
)
}
skipVerify
:=
make
(
map
[
string
]
bool
)
...
...
server/layer.go
View file @
7d1c0047
...
...
@@ -16,15 +16,15 @@ type Layer struct {
status
string
}
func
NewLayer
(
r
io
.
Reader
,
mediatype
string
)
(
*
Layer
,
error
)
{
func
NewLayer
(
r
io
.
Reader
,
mediatype
string
)
(
Layer
,
error
)
{
blobs
,
err
:=
GetBlobsPath
(
""
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
temp
,
err
:=
os
.
CreateTemp
(
blobs
,
"sha256-"
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
defer
temp
.
Close
()
defer
os
.
Remove
(
temp
.
Name
())
...
...
@@ -32,28 +32,28 @@ func NewLayer(r io.Reader, mediatype string) (*Layer, error) {
sha256sum
:=
sha256
.
New
()
n
,
err
:=
io
.
Copy
(
io
.
MultiWriter
(
temp
,
sha256sum
),
r
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
if
err
:=
temp
.
Close
();
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
digest
:=
fmt
.
Sprintf
(
"sha256:%x"
,
sha256sum
.
Sum
(
nil
))
blob
,
err
:=
GetBlobsPath
(
digest
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
status
:=
"using existing layer"
if
_
,
err
:=
os
.
Stat
(
blob
);
err
!=
nil
{
status
=
"creating new layer"
if
err
:=
os
.
Rename
(
temp
.
Name
(),
blob
);
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
}
return
&
Layer
{
return
Layer
{
MediaType
:
mediatype
,
Digest
:
digest
,
Size
:
n
,
...
...
@@ -61,22 +61,22 @@ func NewLayer(r io.Reader, mediatype string) (*Layer, error) {
},
nil
}
func
NewLayerFromLayer
(
digest
,
mediatype
,
from
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"
)
return
Layer
{}
,
errors
.
New
(
"creating new layer from layer with empty digest"
)
}
blob
,
err
:=
GetBlobsPath
(
digest
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
fi
,
err
:=
os
.
Stat
(
blob
)
if
err
!=
nil
{
return
nil
,
err
return
Layer
{}
,
err
}
return
&
Layer
{
return
Layer
{
MediaType
:
mediatype
,
Digest
:
digest
,
Size
:
fi
.
Size
(),
...
...
@@ -109,7 +109,7 @@ func (l *Layer) Remove() error {
}
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
...
...
server/manifest.go
View file @
7d1c0047
...
...
@@ -14,10 +14,10 @@ import (
)
type
Manifest
struct
{
SchemaVersion
int
`json:"schemaVersion"`
MediaType
string
`json:"mediaType"`
Config
Layer
`json:"config"`
Layers
[]
*
Layer
`json:"layers"`
SchemaVersion
int
`json:"schemaVersion"`
MediaType
string
`json:"mediaType"`
Config
Layer
`json:"config"`
Layers
[]
Layer
`json:"layers"`
filepath
string
fi
os
.
FileInfo
...
...
@@ -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
}
...
...
@@ -46,7 +46,7 @@ func (m *Manifest) Remove() error {
}
func
(
m
*
Manifest
)
RemoveLayers
()
error
{
for
_
,
layer
:=
range
append
(
m
.
Layers
,
&
m
.
Config
)
{
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
)
...
...
@@ -95,7 +95,7 @@ func ParseNamedManifest(n model.Name) (*Manifest, error) {
return
&
m
,
nil
}
func
WriteManifest
(
name
model
.
Name
,
config
*
Layer
,
layers
[]
*
Layer
)
error
{
func
WriteManifest
(
name
model
.
Name
,
config
Layer
,
layers
[]
Layer
)
error
{
manifests
,
err
:=
GetManifestPath
()
if
err
!=
nil
{
return
err
...
...
@@ -115,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
,
}
...
...
server/model.go
View file @
7d1c0047
...
...
@@ -26,7 +26,7 @@ import (
var
intermediateBlobs
map
[
string
]
string
=
make
(
map
[
string
]
string
)
type
layerGGML
struct
{
*
Layer
Layer
*
llm
.
GGML
}
...
...
server/routes_delete_test.go
View file @
7d1c0047
...
...
@@ -98,7 +98,7 @@ func TestDeleteDuplicateLayers(t *testing.T) {
}
// create a manifest with duplicate layers
if
err
:=
WriteManifest
(
n
,
config
,
[]
*
Layer
{
config
});
err
!=
nil
{
if
err
:=
WriteManifest
(
n
,
config
,
[]
Layer
{
config
});
err
!=
nil
{
t
.
Fatal
(
err
)
}
...
...
server/upload.go
View file @
7d1c0047
...
...
@@ -26,7 +26,7 @@ import (
var
blobUploadManager
sync
.
Map
type
blobUpload
struct
{
*
Layer
Layer
Total
int64
Completed
atomic
.
Int64
...
...
@@ -362,7 +362,7 @@ func (p *progressWriter) Rollback() {
p
.
written
=
0
}
func
uploadBlob
(
ctx
context
.
Context
,
mp
ModelPath
,
layer
*
Layer
,
opts
*
registryOptions
,
fn
func
(
api
.
ProgressResponse
))
error
{
func
uploadBlob
(
ctx
context
.
Context
,
mp
ModelPath
,
layer
Layer
,
opts
*
registryOptions
,
fn
func
(
api
.
ProgressResponse
))
error
{
requestURL
:=
mp
.
BaseURL
()
requestURL
=
requestURL
.
JoinPath
(
"v2"
,
mp
.
GetNamespaceRepository
(),
"blobs"
,
layer
.
Digest
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment