File size: 5,609 Bytes
c13d23b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfd6ace
c13d23b
 
 
 
cfd6ace
c13d23b
cfd6ace
c13d23b
 
 
cfd6ace
c13d23b
 
 
 
 
 
 
 
6d312fd
c13d23b
cfd6ace
c13d23b
cfd6ace
c13d23b
 
 
 
 
 
 
cfd6ace
c13d23b
 
6d312fd
c13d23b
6d312fd
 
cfd6ace
c13d23b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfd6ace
c13d23b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfd6ace
c13d23b
 
cfd6ace
c13d23b
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<!DOCTYPE html>
<html>
  <head>
    <style>
      body {
        font-family: Arial, sans-serif;
      }
      input, button, progress {
        display: block;
        margin-top: 10px;
      }
      #message {
        margin-top: 20px;
        color: blue;
      }
      #error {
        color: red;
      }
    </style>
  </head>
  <body>
    <label for="tokenInput">Hugging Face Token:</label>
    <input type="password" id="tokenInput" name="tokenInput">
    <label for="repoInput">Repository ID:</label>
    <input type="text" id="repoInput" name="repoInput" placeholder="my-user/nlp-model">
    <input type="file" id="fileUpload" multiple>
    <button id="uploadButton">Upload Files</button>
    <div id="processingMessage"></div>
    <progress id="progressBar" value="0" max="100"></progress>
    <div id="message"></div>
    <div id="error"></div>

    <script type="module">
      import { createRepo, uploadFiles } from "https://cdn.jsdelivr.net/npm/@huggingface/[email protected]/+esm";

      const uploadButton = document.getElementById('uploadButton');
      uploadButton.addEventListener('click', upload);

      function isS3Url(url) {
        // Replace this with the actual condition to identify S3 URLs
        return url.startsWith('https://s3.amazonaws.com/');
      }

      function fetchWithProgress(url, init) {
        if (isS3Url(url)) {
          return new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest();

            xhr.open(init.method || 'GET', url);

            for (let header in init.headers) {
              xhr.setRequestHeader(header, init.headers[header]);
            }

            xhr.onload = () => {
              resolve({
                ok: xhr.status >= 200 && xhr.status < 300,
                status: xhr.status,
                statusText: xhr.statusText,
                text: () => Promise.resolve(xhr.responseText)
              });
            };

            xhr.onerror = () => reject(new TypeError('Network request failed'));

            xhr.ontimeout = () => reject(new TypeError('Network request failed due to timeout'));

            xhr.upload.onprogress = (event) => {
              if (event.lengthComputable) {
                const progress = event.loaded / event.total;
                const progressBar = document.getElementById('progressBar');
                progressBar.value = progress * 100;
              }
            };

            xhr.send(init.body);
          });
        } else {
          return fetch(url, init);
        }
      }

      async function upload() {
        const fileInput = document.getElementById('fileUpload');
        const files = Array.from(fileInput.files);
        const tokenInput = document.getElementById('tokenInput');
        const HF_ACCESS_TOKEN = tokenInput.value;
        const repoInput = document.getElementById('repoInput');
        const REPO_ID = repoInput.value;
        const progressBar = document.getElementById('progressBar');
        const messageDiv = document.getElementById('message');
        const errorDiv = document.getElementById('error');
        const processingMessage = document.getElementById('processingMessage');
        progressBar.value = 0;
        messageDiv.textContent = '';
        errorDiv.textContent = '';
        processingMessage.textContent = '';

        if (files.length > 0) {
          let totalSize = 0;
          for (let file of files) {
            totalSize += file.size;
          }
          totalSize = totalSize / (1024 * 1024);

          const startTime = Date.now();

          try {
            await createRepo({
              repo: REPO_ID,
              credentials: { accessToken: HF_ACCESS_TOKEN },
            });
          } catch (error) {
            if (error.message === 'You already created this model repo') {
              console.log('Repository already exists, proceeding to upload files');
            } else {
              console.error('Error creating repository', error);
              errorDiv.textContent = 'Error creating repository';
              return;
            }
          }

          try {
            await uploadFiles({
              repo: REPO_ID,
              credentials: { accessToken: HF_ACCESS_TOKEN },
              files: files.map(file => ({path: file.name, content: file})),
              fetch: fetchWithProgress
            });

            console.log(`All files uploaded successfully`);
            progressBar.value = 100;
          } catch (error) {
            console.error('Error uploading files', error);
            errorDiv.textContent = 'Error uploading files';
            return;
          }

          const elapsedTime = (Date.now() - startTime) / 1000;
          let speed = totalSize / elapsedTime;

          let time1GB = (1024 / speed) / 60;
          let time5GB = (5 * 1024 / speed) / 60;
          let time10GB = (10 * 1024 / speed) / 60;

          messageDiv.innerHTML = `All files uploaded successfully in ${elapsedTime.toFixed(2)} seconds, for all ${totalSize.toFixed(2)} MB in the ${files.length} files, speed ${speed.toFixed(2)} MB/s.<br>To upload a 1GB model at this speed, it would take approximately ${time1GB.toFixed(2)} minutes.<br>To upload a 5GB model at this speed, it would take approximately ${time5GB.toFixed(2)} minutes.<br>To upload a 10GB model at this speed, it would take approximately ${time10GB.toFixed(2)} minutes.`;
          processingMessage.textContent = "All files processed";
        } else {
          messageDiv.textContent = 'Please select files to upload';
        }
      }
    </script>
  </body>
</html>