mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-26 06:10:29 +01:00
use _wfopen instead of fopen on Windows (#6248)
also fix missing #defines before windows.h, and BPE LF token on MSVC
This commit is contained in:
parent
95562175f8
commit
94d1b3b411
66
ggml.c
66
ggml.c
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "ggml-impl.h"
|
#include "ggml-impl.h"
|
||||||
#include "ggml-quants.h"
|
#include "ggml-quants.h"
|
||||||
|
#include "ggml.h"
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
#include <malloc.h> // using malloc.h with MSC/MINGW
|
#include <malloc.h> // using malloc.h with MSC/MINGW
|
||||||
@ -43,6 +44,10 @@
|
|||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#ifndef NOMINMAX
|
||||||
|
#define NOMINMAX
|
||||||
|
#endif
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
typedef volatile LONG atomic_int;
|
typedef volatile LONG atomic_int;
|
||||||
@ -430,6 +435,57 @@ int64_t ggml_cycles_per_ms(void) {
|
|||||||
#define ggml_perf_cycles_per_ms() 0
|
#define ggml_perf_cycles_per_ms() 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// cross-platform UTF-8 file paths
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
static wchar_t * ggml_mbstowcs(const char * mbs) {
|
||||||
|
int wlen = MultiByteToWideChar(CP_UTF8, 0, mbs, -1, NULL, 0);
|
||||||
|
if (!wlen) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wchar_t * wbuf = GGML_MALLOC(wlen * sizeof(wchar_t));
|
||||||
|
wlen = MultiByteToWideChar(CP_UTF8, 0, mbs, -1, wbuf, wlen);
|
||||||
|
if (!wlen) {
|
||||||
|
GGML_FREE(wbuf);
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wbuf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FILE * ggml_fopen(const char * fname, const char * mode) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
FILE * file = NULL;
|
||||||
|
|
||||||
|
// convert fname (UTF-8)
|
||||||
|
wchar_t * wfname = ggml_mbstowcs(fname);
|
||||||
|
if (wfname) {
|
||||||
|
// convert mode (ANSI)
|
||||||
|
wchar_t * wmode = GGML_MALLOC(strlen(mode) + 1);
|
||||||
|
wchar_t * wmode_p = wmode;
|
||||||
|
do {
|
||||||
|
*wmode_p++ = (wchar_t)*mode;
|
||||||
|
} while (*mode++);
|
||||||
|
|
||||||
|
// open file
|
||||||
|
file = _wfopen(wfname, wmode);
|
||||||
|
|
||||||
|
GGML_FREE(wfname);
|
||||||
|
GGML_FREE(wmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return file;
|
||||||
|
#else
|
||||||
|
return fopen(fname, mode);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// cache line
|
// cache line
|
||||||
//
|
//
|
||||||
@ -18739,7 +18795,7 @@ void ggml_graph_export(const struct ggml_cgraph * cgraph, const char * fname) {
|
|||||||
|
|
||||||
// write binary data
|
// write binary data
|
||||||
{
|
{
|
||||||
FILE * fout = fopen(fname, "wb");
|
FILE * fout = ggml_fopen(fname, "wb");
|
||||||
|
|
||||||
if (!fout) {
|
if (!fout) {
|
||||||
fprintf(stderr, "%s: failed to open %s\n", __func__, fname);
|
fprintf(stderr, "%s: failed to open %s\n", __func__, fname);
|
||||||
@ -18877,7 +18933,7 @@ struct ggml_cgraph * ggml_graph_import(const char * fname, struct ggml_context *
|
|||||||
|
|
||||||
// read file into data
|
// read file into data
|
||||||
{
|
{
|
||||||
FILE * fin = fopen(fname, "rb");
|
FILE * fin = ggml_fopen(fname, "rb");
|
||||||
if (!fin) {
|
if (!fin) {
|
||||||
fprintf(stderr, "%s: failed to open %s\n", __func__, fname);
|
fprintf(stderr, "%s: failed to open %s\n", __func__, fname);
|
||||||
return result;
|
return result;
|
||||||
@ -19213,7 +19269,7 @@ static void ggml_graph_dump_dot_leaf_edge(FILE * fp, struct ggml_tensor * node,
|
|||||||
void ggml_graph_dump_dot(const struct ggml_cgraph * gb, const struct ggml_cgraph * gf, const char * filename) {
|
void ggml_graph_dump_dot(const struct ggml_cgraph * gb, const struct ggml_cgraph * gf, const char * filename) {
|
||||||
char color[16];
|
char color[16];
|
||||||
|
|
||||||
FILE * fp = fopen(filename, "w");
|
FILE * fp = ggml_fopen(filename, "w");
|
||||||
GGML_ASSERT(fp);
|
GGML_ASSERT(fp);
|
||||||
|
|
||||||
fprintf(fp, "digraph G {\n");
|
fprintf(fp, "digraph G {\n");
|
||||||
@ -20531,7 +20587,7 @@ struct gguf_context * gguf_init_empty(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
|
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
|
||||||
FILE * file = fopen(fname, "rb");
|
FILE * file = ggml_fopen(fname, "rb");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -21486,7 +21542,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
|
|||||||
}
|
}
|
||||||
|
|
||||||
void gguf_write_to_file(const struct gguf_context * ctx, const char * fname, bool only_meta) {
|
void gguf_write_to_file(const struct gguf_context * ctx, const char * fname, bool only_meta) {
|
||||||
FILE * file = fopen(fname, "wb");
|
FILE * file = ggml_fopen(fname, "wb");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
GGML_ASSERT(false && "failed to open file for writing");
|
GGML_ASSERT(false && "failed to open file for writing");
|
||||||
}
|
}
|
||||||
|
8
ggml.h
8
ggml.h
@ -214,9 +214,10 @@
|
|||||||
# define GGML_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
|
# define GGML_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define GGML_FILE_MAGIC 0x67676d6c // "ggml"
|
#define GGML_FILE_MAGIC 0x67676d6c // "ggml"
|
||||||
#define GGML_FILE_VERSION 1
|
#define GGML_FILE_VERSION 1
|
||||||
@ -708,6 +709,9 @@ extern "C" {
|
|||||||
|
|
||||||
GGML_API void ggml_print_backtrace(void);
|
GGML_API void ggml_print_backtrace(void);
|
||||||
|
|
||||||
|
// accepts a UTF-8 path, even on Windows
|
||||||
|
GGML_API FILE * ggml_fopen(const char * fname, const char * mode);
|
||||||
|
|
||||||
GGML_API void ggml_numa_init(enum ggml_numa_strategy numa); // call once for better performance on NUMA systems
|
GGML_API void ggml_numa_init(enum ggml_numa_strategy numa); // call once for better performance on NUMA systems
|
||||||
GGML_API bool ggml_is_numa(void); // true if init detected that system has >1 NUMA node
|
GGML_API bool ggml_is_numa(void); // true if init detected that system has >1 NUMA node
|
||||||
|
|
||||||
|
@ -1065,7 +1065,7 @@ struct llama_file {
|
|||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
llama_file(const char * fname, const char * mode) {
|
llama_file(const char * fname, const char * mode) {
|
||||||
fp = std::fopen(fname, mode);
|
fp = ggml_fopen(fname, mode);
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
throw std::runtime_error(format("failed to open %s: %s", fname, strerror(errno)));
|
throw std::runtime_error(format("failed to open %s: %s", fname, strerror(errno)));
|
||||||
}
|
}
|
||||||
@ -4006,7 +4006,7 @@ static void llm_load_vocab(
|
|||||||
} else if (vocab.type == LLAMA_VOCAB_TYPE_WPM) {
|
} else if (vocab.type == LLAMA_VOCAB_TYPE_WPM) {
|
||||||
vocab.linefeed_id = vocab.special_pad_id;
|
vocab.linefeed_id = vocab.special_pad_id;
|
||||||
} else {
|
} else {
|
||||||
const std::vector<int> ids = llama_tokenize_internal(vocab, "\u010A", false);
|
const std::vector<int> ids = llama_tokenize_internal(vocab, "\xC4\x8A", false); // U+010A
|
||||||
GGML_ASSERT(!ids.empty() && "model vocab missing newline token");
|
GGML_ASSERT(!ids.empty() && "model vocab missing newline token");
|
||||||
vocab.linefeed_id = ids[0];
|
vocab.linefeed_id = ids[0];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user