From 0f3f9e353df96d4cfc40ac19114c782a57fe30f5 Mon Sep 17 00:00:00 2001 From: Daniel Hipke Date: Fri, 4 Apr 2025 17:04:24 -0700 Subject: [PATCH] ml/backend/ggml: create a new file descriptor for tensor (#10133) improves model loading times on network-based filesystems such as GCS fuse by creating a dedicated file descriptor for each section of the file being read, reducing seeking --- ml/backend/ggml/ggml.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ml/backend/ggml/ggml.go b/ml/backend/ggml/ggml.go index a106fed5f..7e81e9950 100644 --- a/ml/backend/ggml/ggml.go +++ b/ml/backend/ggml/ggml.go @@ -319,7 +319,14 @@ func New(ctx context.Context, r *os.File, params ml.BackendParams) (ml.Backend, tts[i] = tt } - sr := io.NewSectionReader(r, int64(meta.Tensors().Offset+t.Offset), int64(t.Size())) + // Create a new FD for each goroutine so that each FD is read sequentially, rather than + // seeking around within an FD shared between all goroutines. + file, err := os.Open(r.Name()) + if err != nil { + return err + } + defer file.Close() + sr := io.NewSectionReader(file, int64(meta.Tensors().Offset+t.Offset), int64(t.Size())) bts := make([]byte, 128*format.KibiByte) var s uint64