create blobs in parallel
This commit is contained in:
parent
e9e5f61c45
commit
588a97dbef
47
cmd/cmd.go
47
cmd/cmd.go
@ -22,6 +22,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@ -31,6 +32,7 @@ import (
|
|||||||
"github.com/olekukonko/tablewriter"
|
"github.com/olekukonko/tablewriter"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
"golang.org/x/term"
|
"golang.org/x/term"
|
||||||
|
|
||||||
"github.com/ollama/ollama/api"
|
"github.com/ollama/ollama/api"
|
||||||
@ -106,7 +108,7 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
spinner.Stop()
|
spinner.Stop()
|
||||||
|
|
||||||
req.Name = args[0]
|
req.Model = args[0]
|
||||||
quantize, _ := cmd.Flags().GetString("quantize")
|
quantize, _ := cmd.Flags().GetString("quantize")
|
||||||
if quantize != "" {
|
if quantize != "" {
|
||||||
req.Quantize = quantize
|
req.Quantize = quantize
|
||||||
@ -117,26 +119,43 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(req.Files) > 0 {
|
var mu sync.Mutex
|
||||||
fileMap := map[string]string{}
|
var g errgroup.Group
|
||||||
for f, digest := range req.Files {
|
g.SetLimit(max(runtime.GOMAXPROCS(0)-1, 1))
|
||||||
|
// copy files since we'll be modifying the map
|
||||||
|
temp := req.Files
|
||||||
|
req.Files = make(map[string]string, len(temp))
|
||||||
|
for f, digest := range temp {
|
||||||
|
g.Go(func() error {
|
||||||
if _, err := createBlob(cmd, client, f, digest, p); err != nil {
|
if _, err := createBlob(cmd, client, f, digest, p); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fileMap[filepath.Base(f)] = digest
|
|
||||||
}
|
mu.Lock()
|
||||||
req.Files = fileMap
|
req.Files[filepath.Base(f)] = digest
|
||||||
|
mu.Unlock()
|
||||||
|
return nil
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(req.Adapters) > 0 {
|
// copy files since we'll be modifying the map
|
||||||
fileMap := map[string]string{}
|
temp = req.Adapters
|
||||||
for f, digest := range req.Adapters {
|
req.Adapters = make(map[string]string, len(temp))
|
||||||
|
for f, digest := range temp {
|
||||||
|
g.Go(func() error {
|
||||||
if _, err := createBlob(cmd, client, f, digest, p); err != nil {
|
if _, err := createBlob(cmd, client, f, digest, p); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fileMap[filepath.Base(f)] = digest
|
|
||||||
}
|
mu.Lock()
|
||||||
req.Adapters = fileMap
|
req.Adapters[filepath.Base(f)] = digest
|
||||||
|
mu.Unlock()
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := g.Wait(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
bars := make(map[string]*progress.Bar)
|
bars := make(map[string]*progress.Bar)
|
||||||
@ -213,7 +232,7 @@ func createBlob(cmd *cobra.Command, client *api.Client, path string, digest stri
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err = client.CreateBlob(cmd.Context(), digest, io.TeeReader(bin, &pw)); err != nil {
|
if err := client.CreateBlob(cmd.Context(), digest, io.TeeReader(bin, &pw)); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return digest, nil
|
return digest, nil
|
||||||
|
@ -690,7 +690,7 @@ func TestCreateHandler(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.Name != "test-model" {
|
if req.Model != "test-model" {
|
||||||
t.Errorf("expected model name 'test-model', got %s", req.Name)
|
t.Errorf("expected model name 'test-model', got %s", req.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user